Объясните разницу между копиконструктором и operator=
От: Аноним  
Дата: 14.03.06 07:59
Оценка:
сабж
Re: Объясните разницу между копиконструктором и operator=
От: Rothmans  
Дата: 14.03.06 08:05
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>сабж


Один вызывается при конструировании копированием, другой при явном вызове.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Объясните разницу между копиконструктором и operator=
От: Аноним  
Дата: 14.03.06 08:07
Оценка:
Здравствуйте, Rothmans, Вы писали:

R>Здравствуйте, <Аноним>, Вы писали:


А>>сабж


R>Один вызывается при конструировании копированием, другой при явном вызове.


А в реализации нет вообще никакой разницы?

Тогда почему не предусмотрено использование одного без реализации другого?
Re[3]: Объясните разницу между копиконструктором и operator=
От: Rothmans  
Дата: 14.03.06 08:07
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, Rothmans, Вы писали:


R>>Здравствуйте, <Аноним>, Вы писали:


А>>>сабж


R>>Один вызывается при конструировании копированием, другой при явном вызове.


А>А в реализации нет вообще никакой разницы?


А>Тогда почему не предусмотрено использование одного без реализации другого?


Чегойто? Вроде можно один без другого.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Объясните разницу между копиконструктором и operator=
От: Аноним  
Дата: 14.03.06 08:11
Оценка:
Здравствуйте, Rothmans, Вы писали:
R>Чегойто? Вроде можно один без другого.

Итого: сабж
Re: Объясните разницу между копиконструктором и operator=
От: g_i  
Дата: 14.03.06 08:14
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>сабж


operator = выполняется для существующего объекта.
A a;
A b;
b = a;

Копирующий конструктор создает копию объекта, передаваемого ему в качестве параметра (по смыслу).
A a;
A b(a);

Фактически, если копирующий конструктор не объявлен для некоторого класса, при его вызове произойдет побитовое копирование исходного объекта (будет вызван копирующий конструктор по-умолчанию). Поэтому, чаще всего копирующий конструктор определяют явно или объявляют (часто без определения) в закрытой/защищенной секции класса.

Нужно заметить, что в следующем коде будет вызван именно конструктор копирования, а не конструктор + оператор присваивания.
A a;
A b = a;
Re: Объясните разницу между копиконструктором и operator=
От: Аноним  
Дата: 14.03.06 08:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>сабж

В конструкторе создаётся новый экземляр, который есть копия переданного в него
экземпляра. operator = предназначен для того, что бы скопировать данные из данного экземпляра в
уже существующий экземпляр, т.е. что бы сделать уже существуюший экземляр копией
данного. ИМХО.
Re[2]: Объясните разницу между копиконструктором и operator=
От: Crackjack Россия  
Дата: 14.03.06 08:29
Оценка:
Возможны разные реализации operator = () и конструктора копирования.
Пример:
class Value
{
int a;
public:
Value(int a);
Value(const Value& obj);
operator = (int a);
operator = (double a);
operator = (char a);
operator = (DWORD a);
operator = (void* data);
....
};
Re[2]: Объясните разницу между копиконструктором и operator=
От: Bell Россия  
Дата: 14.03.06 08:41
Оценка: +2
Здравствуйте, g_i, Вы писали:

g_i>Фактически, если копирующий конструктор не объявлен для некоторого класса, при его вызове произойдет побитовое копирование исходного объекта.


Конструктор копирования по умолчанию выполняет не побитовое, а почленное копирование (как и оператор присваивания по умолчанию — почленное присваивание), а это 2 большие разницы.
Любите книгу — источник знаний (с) М.Горький
Re[3]: Объясните разницу между копиконструктором и operator=
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 14.03.06 10:27
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, g_i, Вы писали:


g_i>>Фактически, если копирующий конструктор не объявлен для некоторого класса, при его вызове произойдет побитовое копирование исходного объекта.


B>Конструктор копирования по умолчанию выполняет не побитовое, а почленное копирование (как и оператор присваивания по умолчанию — почленное присваивание), а это 2 большие разницы.


Что то меня клинит, пояните пожадуйста, что имеется ввиду под почленным копированием?
Re[4]: Объясните разницу между копиконструктором и operator=
От: Bell Россия  
Дата: 14.03.06 10:29
Оценка:
Здравствуйте, AcidTheProgrammer, Вы писали:

ATP>Что то меня клинит, пояните пожадуйста, что имеется ввиду под почленным копированием?


Для каждого члена класса вызывается его собственный конструктор копирования.
Любите книгу — источник знаний (с) М.Горький
Re[5]: Объясните разницу между копиконструктором и operator=
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 14.03.06 10:32
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, AcidTheProgrammer, Вы писали:


ATP>>Что то меня клинит, пояните пожадуйста, что имеется ввиду под почленным копированием?


B>Для каждого члена класса вызывается его собственный конструктор копирования.


Фу-у-у-уф.... Спасибо за пояснение, а то что-то я не то начал себе представлять В общем главное что всегда так и думал.
Re: Объясните разницу между копиконструктором и operator=
От: Аноним  
Дата: 15.03.06 09:09
Оценка:
Конструктор копирования еще используется неявно когда объект копируется по значению (если он не объявлен как explicit):

struct my_struct { /*...*/ };
void foo(my_struct);

void bar()
{
  my_struct x;
  foo(x); //copy contructor of my_struct is called
}


— Zigmar
Re[6]: Объясните разницу между копиконструктором и operator=
От: icWasya  
Дата: 15.03.06 09:50
Оценка:
Здравствуйте, AcidTheProgrammer, Вы писали:

ATP>Что то меня клинит, пояните пожадуйста, что имеется ввиду под почленным копированием?


...

ATP>Фу-у-у-уф.... Спасибо за пояснение, а то что-то я не то начал себе представлять

В смысле квадратный трёхчлен?
Re[3]: Объясните разницу между копиконструктором и operator=
От: i-maverick Россия  
Дата: 15.03.06 09:53
Оценка:
Здравствуйте, Аноним, Вы писали:

R>>Один вызывается при конструировании копированием, другой при явном вызове.

А>А в реализации нет вообще никакой разницы?

Как это нет разницы?! Если в первом случае нужно создавать новый объект, а во втором — нет.
Re[2]: Объясните разницу между копиконструктором и operator=
От: ecco Россия  
Дата: 15.03.06 10:06
Оценка:
Здравствуйте, g_i, Вы писали:

gg_i>Нужно заметить, что в следующем коде будет вызван именно конструктор копирования, а не конструктор + оператор присваивания.

g_i>
g_i>A a;
g_i>A b = a;
g_i>


Вопрос по выделенному выражению:
А что должно произойти с точки зрения стандарта, если не доступен A( const A& ), но есть A() и A::operator = ( const A& )?
Будут ли они использованы для конструирования объекта?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Объясните разницу между копиконструктором и operator=
От: ekamaloff Великобритания  
Дата: 15.03.06 10:18
Оценка:
Здравствуйте, ecco, Вы писали:

g_i>>
g_i>>A a;
g_i>>A b = a;
g_i>>


E>Вопрос по выделенному выражению:

E>А что должно произойти с точки зрения стандарта, если не доступен A( const A& ), но есть A() и A::operator = ( const A& )?
E>Будут ли они использованы для конструирования объекта?

А что гадать, раз Comeau не компилит:

class A
{
public:
  A();
  A& operator =(const A&);
private:
  A(const A&);
};

int main()
{
  A a, b = a;
  return 0;
}


значит нет
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[3]: Объясните разницу между копиконструктором и operator=
От: LuciferMoscow Россия  
Дата: 15.03.06 10:26
Оценка:
Здравствуйте, Аноним, Вы писали:
R>>Один вызывается при конструировании копированием, другой при явном вызове.
А>А в реализации нет вообще никакой разницы?
Обычно один реализуют через другой.

class A
{
//....
};

A::A(const A&)
{
//....
}

const A& A::operator=(const A& init)
{
  A temp(init);
  this->swap( temp );
}


Но не всегда.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.