#include <stdio.h>
class B
{
public:
B& operator=(const B &b)
{
printf("BBBBBBBB \n");
return *this;
};
};
class C
{
public:
C& operator=(const C &c)
{
printf("CCCCCCC \n");
return *this;
};
};
class D : public B,public C
{
public:
D& operator=(const C &c)
{
printf("DDDDDD \n");
return *this;
};
};
int main(int argc, char* argv[])
{
C c1;
D d1,d2;
d1=d2;
d1=c1;
return 0;
}
скомпилированный g++ выдает
BBBBBBBB
CCCCCCC
DDDDDD
Есть идеи почему???
Почему компайлер ставит оба вызова (порядок мало интересен — он понятен)? Вроде должен быть или один или ошибка компиляции.
(Если кто то знает по какому правилу стандарта оно себя так ведет — был бы рад узнать номер правила)
Здравствуйте, AlexTAI, Вы писали:
ATA>Почему следующий код ATA>[ccode]
... ATA>скомпилированный g++ выдает ATA>
ATA>BBBBBBBB
ATA>CCCCCCC
ATA>DDDDDD
ATA>Есть идеи почему??? ATA>Почему компайлер ставит оба вызова (порядок мало интересен — он понятен)? Вроде должен быть или один или ошибка компиляции.
ATA>(Если кто то знает по какому правилу стандарта оно себя так ведет — был бы рад узнать номер правила)
Хм... А как это может по-другому работать, просто у меня даже идей на этот счет нет?
Ну смотри, ты один объект класса D присваиваешь другому объекту того же класса. Соответствующего оператора копирования в D нет, потому используется оператор копирования по умолчанию. Это означает, что будут просто вызваны операторы копирования для всех членов класса. В результате, мы видим на экране строки:BBBBBBBB и CCCCCCC. Полет идет нормально. Далее, ты присваиваешь объекту класса D объект класса C, но на этот раз в классе D есть подходящий оператор копирования, он и вызывается. Результат — строка DDDDDD. В чем проблема?
лэт ми спик фром май харт
Re[2]: Странное поведение с перегрузкой оператора =
Здравствуйте, prVovik, Вы писали:
V> ты один объект класса D присваиваешь другому объекту того же класса. Соответствующего оператора копирования в D нет, потому используется оператор копирования по умолчанию. Это означает, что будут просто вызваны операторы копирования для всех членов класса. В результате, мы видим на экране строки:BBBBBBBB и CCCCCCC.
а разве стандарт не говорит что в случае отсутствия оператора копирования будет произведено побитовое копирование? Или же будут вызываться операторы копирования для каждого мембера по отдельности? Или это оставляется на плечи реализации?
Удалено избыточное цитирование. -- ПК
Тумаров Александр ( AlexTAI )
alextai3@yahoo.com
Re[3]: Странное поведение с перегрузкой оператора =
Здравствуйте, AlexTAI, Вы писали:
ATA>а разве стандарт не говорит что в случае отсутствия оператора копирования будет произведено побитовое копирование?
Нет, не говорит.
Оператор копирования всегда есть, если его физически можно сгенерировать. Просто он определяется неявно, если он не определён явно.
ATA>Или же будут вызываться операторы копирования для каждого мембера по отдельности?
Или же.
ATA>Или это оставляется на плечи реализации?
Здравствуйте, AlexTAI, Вы писали:
ATA>>>Или же будут вызываться операторы копирования для каждого мембера по отдельности?
Ш>>Или же.
ATA>>>Или это оставляется на плечи реализации?
ATA>Можно уточнить ответ (а то он не однозначен ) ATA>Что эе это будет:
ATA>1. будут вызываться операторы копирования для каждого мембера по отдельности
Ага.
ATA>2. Это лежит на усмотрение реализации компайлера.
Компилятор может соптимизировать процесс, не меняя, естественно, семантики операции.
Например, для больших структур данных он может вставить вызов memcpy, если это будет иметь тот же эффект, что и почленное копирование.
Здравствуйте, AlexTAI, Вы писали:
ATA>а разве стандарт не говорит что в случае отсутствия оператора копирования будет произведено побитовое копирование?
В С++ нет и никогда не было никакого "побитового копирования".
ATA>Или же будут вызываться операторы копирования для каждого мембера по отдельности?
Именно так.
Best regards,
Андрей Тарасевич
Re[4]: Странное поведение с перегрузкой оператора =
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>В С++ нет и никогда не было никакого "побитового копирования".
Гх-м-м... может я совсем Металлики услушался, но мне отчетливо помнится, что когда для класса явно не определяются оператор присваивания/конструктор копирования, компилятор генерирует оные самостоятельно, используя как раз-таки побитовое копирование полей.
Здравствуйте, SchweinDeBurg, Вы писали:
АТ>>В С++ нет и никогда не было никакого "побитового копирования".
SDB>Гх-м-м... может я совсем Металлики услушался, но мне отчетливо помнится, что когда для класса явно не определяются оператор присваивания/конструктор копирования, компилятор генерирует оные самостоятельно, используя как раз-таки побитовое копирование полей.
Компилятор генерирует оные самостоятельно, выполняя почленное копирование данного класса. Если члены данного класса сам являются экземплярами классов, то для них вызываются их операторы присваивания/конструкторы копирования. И т.д. В конце концов дело доходит до фундаментальных типов, копирование которых можно, конечно, назвать "побитовым", но это в данном случае совершенно не принципиально.