Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
matepuhko
20 / 20 / 23
Регистрация: 05.06.2011
Сообщений: 119
1

Конструктор копирования, присваивания

14.05.2015, 16:21. Просмотров 750. Ответов 4
Метки нет (Все метки)

Пусть есть класс
C++
1
2
3
4
class some{
private : 
int a ;
};
Перегрузить оператор "=" можно так
C++
1
2
3
4
5
some& operator=(const some& that){
   if(this != &that){
      this->~some() ;
      new (this) = some(that) ;
}
Вопрос первый почему нельзя зделать так :
C++
1
2
3
4
friend some& operator=(const some& that){
      this-> a = that.a ;
      return &this ;
}//Ошыбка компиляции some& operator=(const some&)' must be a nonstatic member function
Или friend функция всегда статистична?

Вопрос №2
Копирующий конструктор
Для примера расмотрим клас выше.
Тут работает все ок.
C++
1
2
some sm0 ;
some sm1(sm0) ;//Если не переопределять копирующий конструкто то все ок
Но если нам надо ручками переопределить конструктор копирования, то без метода виду
C++
1
int getA(){ return a;}
нам не обойтись? А если обойтись то как?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2015, 16:21
Ответы с готовыми решениями:

Конструктор присваивания или копирования
Есть программа. В ней есть класс стэк. Нужно написать оператор копирования...

Конструктор копирования и оператор присваивания
Не понимаю, когда используется один, а когда другой. Написал простой пример с...

Конструктор копирования и оператор присваивания
Есть класс (синтетический, создан для примера) class Object { private: ...

Конструктор копирования и операция присваивания в классе
Народ, вот есть такие объявления(motto - объект класса StringBad): StringBad...

Про конструктор копирования, оператор присваивания
Объясните, пожалуйста, принцип действия конструктора копирования и операции...

4
mymedia
193 / 193 / 120
Регистрация: 27.05.2011
Сообщений: 544
14.05.2015, 19:11 2
Цитата Сообщение от matepuhko Посмотреть сообщение
Вопрос первый почему нельзя зделать так :
Ответ на первый вопрос тебе дал компилятор
Цитата Сообщение от matepuhko Посмотреть сообщение
//Ошыбка компиляции some& operator=(const some&)' must be a nonstatic member function
По стандарту перегрузка оператора присваивания может производиться только в функции-члене. Так написано у меня в справочнике.

Цитата Сообщение от matepuhko Посмотреть сообщение
Но если нам надо ручками переопределить конструктор копирования, то без метода виду
Что вы имеете ввиду?
1
Nosey
1376 / 403 / 144
Регистрация: 22.10.2014
Сообщений: 872
Завершенные тесты: 2
14.05.2015, 19:22 3
Цитата Сообщение от matepuhko Посмотреть сообщение
нам не обойтись? А если обойтись то как?
Обойтись.
Приватные поля - это поля доступные в этом классе, и без разницы какой это объект.
т.е. что
C++
1
this->a;
что
C++
1
otherPtr->a;
будут работать.
1
DrOffset
8928 / 4809 / 1176
Регистрация: 30.01.2014
Сообщений: 7,848
14.05.2015, 19:34 4
Лучший ответ Сообщение было отмечено matepuhko как решение

Решение

Цитата Сообщение от matepuhko Посмотреть сообщение
Перегрузить оператор "=" можно так
Так делать нельзя.
Если хочется использовать конструктор копирования для реализации оператора присваивания и одновременно с этим уничтожить текущее состояние класса, то есть прекрасная идиома copy-and-swap.

Цитата Сообщение от matepuhko Посмотреть сообщение
Вопрос первый почему нельзя cделать так
Операция присваивания всегда применяется к какому-либо объекту.
Нет логической необходимости позволять оператору быть свободной функцией (friend в данном случае к вопросу отношения вообще не имеет), т.к. слева от него всегда должен быть объект присваиваемого типа.

Цитата Сообщение от matepuhko Посмотреть сообщение
Копирующий конструктор
Метод getA для реализации копирующего конструктора необязателен.
C++
1
2
3
4
5
6
7
8
9
class some
{
public:
    some(some const & that)
       : a(that.a)
    {}
private: 
    int a ;
};
Правильный оператор присваивания для этого класса будет выглядеть так:
C++
1
2
3
4
5
6
7
8
some& some::operator=(some const & that)
{
   if(this != &that)
   {
       a = that.a;
   }
   return *this;
}
Или с использование copy-and-swap, что, впрочем, для такого класса не имеет смысла. Для реалистичности представим, что внутри у нас не int, а указатель на объект типа other, вспомнив, что ты хотел уничтожения старых данных при присваивании:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class some
{
public:
     some() : data(new other()) 
     {} 
     some& operator=(some const & that);
     some(some const & that);
 
     void swap(some & that);
private:
     other * data;
};
// Оператор присваивания
some& some::operator=(some const & that)
{
   if(this != &that)
   {
       some(that).swap(*this); // copy-and-swap idiom
       // старый other здесь уничтожится
   }
   return *this;
}
// Конструктор копирования:
some::some(some const & that)
    : data(new other(*that.data))
{ }
// Деструктор:
some::~some()
{
    delete data;
}
// Функция swap:
void some::swap(some & that)
{
    std::swap(that.data, data);
}
1
matepuhko
20 / 20 / 23
Регистрация: 05.06.2011
Сообщений: 119
15.05.2015, 12:07  [ТС] 5
Всем спасибо за ответы. Тему можно закрывать.
0
15.05.2015, 12:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2015, 12:07

Конструктор копирования и перегрузка оператора присваивания
Здравствуйте! Возникла следующая проблема: не могу перегрузить оператор...

Очередь, конструктор копирования и перегруженный оператор присваивания
#include <iostream> using namespace std; typedef char type; struct Node {...

Конструктор копирования и оператор присваивания - общая часть, выделять ли в отдельный метод
Как лучше? // конструктор копирования Fraction::Fraction( const Fraction&...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru