Здравствуйте, LaptevVV, Вы писали:
LVV>Не совсем так. Так получилось, что вчера только проверял такие конструкции на VC6 и BCB6 для реализованных типов — во всех случаях вызывается конструктор инициализации.
Здравствуйте, Vamp, Вы писали:
V> Разница только в синтаксисе.
class C
{
public:
C(int) { }
private:
C(const C&);
};
int main()
{
C c (10);
}
Ok.
int main()
{
C d = 10;
}
Низзя — конструктор копирования private:
F:\test>como -c test.cpp
Comeau C/C++ 4.3.3 (Oct 25 2003 12:02:26) for MS_WINDOWS_x86
Copyright 1988-2003 Comeau Computing. All rights reserved.
MODE:strict warnings C++
"test.cpp", line 13: warning: "C::C(const C &)", required for copy that was
eliminated, is inaccessible
C d = 10;
^
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Дело не в том, что они не правы, а в том, что им разрешены упрощения. Конечно, вопрос не особо важный. Кстати, раз уж речь о VC 6.0 — прикольно, он оптимизирует (выбрасывает лишнее копирование в некоторых случаях) только при наличии нетривиального деструктора.
Of course, the code must be complete enough to compile and link.
Здравствуйте, vgrigor, Вы писали:
B>>Эээ... можно подробней про побитовое копирование?
V>Если у типа нет переопределенной операции =, V>нет конструктора копирования, V>то когда вы пишите =, V>то имеется ввиду именно битовая копия.
V>Чего еще остается присваивать?
Отнюдь. Если у объекта нет переопределённого конструктора копирования и переопределённого же оператора присваивания — компилятор определит по умолчанию почленное копирование/присваивание соответственно.
struct member
{
char* s;
member(const char* v) { cout << "member("<<v<<")" << endl; s = strdup(v); }
member(const member& m) { cout << "member(copy:"<<v<<")" << endl; s = strdup(m.s); }
void operator=(const member& m) { cout << "member=copy:" << v << endl; free(s); s = strdup(m.s); }
~member() { free(s); }
};
struct object
{
member x, y;
int z, t;
object() : x("hello"), y("world"), z(1), t(2) {}
};
main()
{
object a;
object b = a;
assert(a.x.s != b.x.s);
assert(strcmp(a.x.s, b.x.s)==0);
}
К>Отнюдь. Если у объекта нет переопределённого конструктора копирования и переопределённого же оператора присваивания — компилятор определит по умолчанию почленное копирование/присваивание соответственно.
В случае тривиальных оператора присваивани/конструктора копирования компилятор не сгенерирует их определения. Будет происходить почленное присваивание, которое vgrigor назвал побитным копированием.
struct A
{
int a_, b_;
};
void g()
{
A a = {1,2};
A b(a);
b = a;//никакие конструкторы и операторы тут не вызываются.
}
Of course, the code must be complete enough to compile and link.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
К>>Отнюдь. Если у объекта нет переопределённого конструктора копирования и переопределённого же оператора присваивания — компилятор определит по умолчанию почленное копирование/присваивание соответственно. L_L>В случае тривиальных оператора присваивани/конструктора копирования компилятор не сгенерирует их определения. Будет происходить почленное присваивание, которое vgrigor назвал побитным копированием.
A compiler-generated copy constructor sets up a new object and performs a memberwise copy of the contents of the object to be copied. If base class or member constructors exist, they are called; otherwise, bitwise copying is performed.
____________ MSDN:
C++ Language Reference
"Rules for Declaring Constructors"
Здравствуйте, vgrigor, Вы писали:
V>A compiler-generated copy constructor sets up a new object and performs a memberwise copy of the contents of the object to be copied. If base class or member constructors exist, they are called; otherwise, bitwise copying is performed.
1)А теперь давай цитату не из MSDN(он в этом фореме не котируется ), а из стандарта.
2)Это лищь оптимизация проводимая конкретным компилятором.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, vgrigor, Вы писали:
V>A compiler-generated copy constructor sets up a new object and performs a memberwise copy of the contents of the object to be copied. If base class or member constructors exist, they are called; otherwise, bitwise copying is performed.
V>____________ MSDN: V> C++ Language Reference V>"Rules for Declaring Constructors"
И что? Или ты считаешь, что побитовое копирование, и memberwise copy — одно и то же? Если да — то ты ошибаешься.
Вот цитата из стандарта:
12.8/8
The implicitly-defined copy constructor for class X performs a memberwise copy of its subobjects.
The order of copying is the same as the order of initialization of bases and members in a
userdefined constructor (see 12.6.2). Each subobject is copied in the manner appropriate
to its type:
if the subobject is of class type, the copy constructor for the class is used;
if the subobject is an array, each element is copied, in the manner appropriate to the element type;
if the subobject is of scalar type, the builtin assignment operator is used.
Virtual base class subobjects shall be copied only once by the implicitlydefined
copy constructor (see 12.6.2).
ПК>F:\test>como -c test.cpp
ПК>Comeau C/C++ 4.3.3 (Oct 25 2003 12:02:26) for MS_WINDOWS_x86
ПК>Copyright 1988-2003 Comeau Computing. All rights reserved.
ПК>MODE:strict warnings C++
ПК>"test.cpp", line 13: warning: "C::C(const C &)", required for copy that was
ПК> eliminated, is inaccessible
ПК> C d = 10;
ПК> ^
ПК>
Как всегда, самый аргументированный ответ! Спасибо!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, vgrigor, Вы писали:
v> A compiler-generated copy constructor sets up a new object and performs v> a memberwise copy of the contents of the object to be copied. If base v> class or member constructors exist, they are called; v> otherwise, bitwise copying is performed.
Ну и отлично: это означает, что для классов по умолчанию выполняется
почленное (а не побитовое) копирование. В стандарте написано то же самое.
hint: для классов всегда объявлен конструктор копирования. Либо
явно пользователем, либо неявно компилятором.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Здравствуйте, vgrigor, Вы писали:
v>> A compiler-generated copy constructor sets up a new object and performs v>> a memberwise copy of the contents of the object to be copied. If base v>> class or member constructors exist, they are called; v>> otherwise, bitwise copying is performed.
ПК>Ну и отлично: это означает, что для классов по умолчанию выполняется ПК>почленное (а не побитовое) копирование. В стандарте написано то же самое. ПК>hint: для классов всегда объявлен конструктор копирования. Либо ПК>явно пользователем, либо неявно компилятором.
Где написано?
может быть разница для явно определенных кнструкторов и неявных
в отношении способа копирования?
Здравствуйте, vgrigor, Вы писали:
ПК>> для классов всегда объявлен конструктор копирования. Либо ПК>> явно пользователем, либо неявно компилятором.
v> Где написано?
Любой хороший учебник по C++. Международный стандарт C++ ISO/IEC 14882.
12/1 The default constructor (12.1), copy constructor and copy
assignment operator (12.8), and destructor (12.4) are special member
functions. The implementation will implicitly declare these member
functions for a class type when the program does not explicitly declare them
v> может быть разница для явно определенных кнструкторов и неявных v> в отношении способа копирования?
Может. Если ты сам определишь свой конструктор копирования так, чтобы он
копировал члены класса побитно — будет отличаться.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен