Здравствуйте, 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"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Vamp, Вы писали:
L_L>>Разница есть. V>Никакой.
Вот ведь упорный какой
Попробуй так:
#include <iostream>
struct A {
A() {
std::cout << "Default ctor" << std::endl;
}
A(int) {
std::cout << "int ctro" << std::endl;
}
private:
A(const A&) {
std::cout << "Copy ctor" << std::endl;
}
};
int main()
{
A a = 5;
A a2(5);
return 0;
}
ЗЫ
Только не на VC6
ЗЗЫ
В некоторых ситуациях компилятор может оптимизировать инициализацию копированием за счет использования "более подходящего" конструктора. Но конструктор копирования все равно должен быть доступен.
Здравствуйте, LaptevVV, Вы писали:
LVV>Не совсем так. Так получилось, что вчера только проверял такие конструкции на VC6 и BCB6 для реализованных типов — во всех случаях вызывается конструктор инициализации.
Здравствуйте, 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).
Здравствуйте, 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"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, MichaelXP, Вы писали:
MXP> Есть ли различия в инициализации перименных/объектов спосабами приведенными ниже? MXP> int i(4); MXP> int j = int(4); MXP> int k = 4;
Нет. Во всех случаях будет вызван конструктор копирования (если говорить не только об int)
Здравствуйте, MichaelXP, Вы писали:
MXP> Есть ли различия в инициализации перименных/объектов спосабами приведенными ниже? MXP> int i(4); MXP> int j = int(4); MXP> int k = 4;
Для встроенных типов разницы нет.
Для объектов пользовательских типов разница есть:
Вариант 1 — непосредственная инициализация (direct initialization), вызывается "обычный" конструктор.
Варианты 2 и 3 — инициализация копированием, для которой используется конструктор копирования (при этом аргумент при необходимости может быть неявно преобразован к типу инициализируемого объекта).
Gotcha!
MXP>> int i(4); MXP>> int j = int(4); MXP>> int k = 4; B>Варианты 2 и 3 — инициализация копированием, для которой используется конструктор копирования
Здравствуйте, Vamp, Вы писали:
V>Gotcha!
MXP>>> int i(4); MXP>>> int j = int(4); MXP>>> int k = 4; B>>Варианты 2 и 3 — инициализация копированием, для которой используется конструктор копирования
V>Найн! Между вариантами 1 и 3 разницы нет.
Ладно, уточню.
Если типы инициализируемого объекта и инициализатора совпадают, то разницы действительно нет — в обоих случаях будет использован констпуктор копии. В общем же случае варианты 1 и 3 — это не одно и то же.
B>Если типы инициализируемого объекта и инициализатора совпадают, то разницы действительно нет — в обоих случаях будет использован констпуктор копии. В общем же случае варианты 1 и 3 — это не одно и то же.
Разница только в синтаксисе.
Здравствуйте, Vamp, Вы писали:
B>>Если типы инициализируемого объекта и инициализатора совпадают, то разницы действительно нет — в обоих случаях будет использован констпуктор копии. В общем же случае варианты 1 и 3 — это не одно и то же. V>Разница только в синтаксисе.
Это не так.
Здравствуйте, Vamp, Вы писали:
B>>Если типы инициализируемого объекта и инициализатора совпадают, то разницы действительно нет — в обоих случаях будет использован констпуктор копии. В общем же случае варианты 1 и 3 — это не одно и то же. V>Разница только в синтаксисе.
Для невстроенных типов, где это вопрос имеет смысл,
— бывает определен оператор.=,
— конструктор,
— конструкотор копирования
— и побитовое копирование
и тогда при разном ситаксисе можно вызывать сочетания этих
вариантов, так что случаи могут быть разные.
Здравствуйте, vgrigor, Вы писали:
V>Для невстроенных типов, где это вопрос имеет смысл, V> — бывает определен оператор.=, V> — конструктор, V> — конструкотор копирования V> — и побитовое копирование V>и тогда при разном ситаксисе можно вызывать сочетания этих V>вариантов, так что случаи могут быть разные.
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, MichaelXP, Вы писали:
MXP>> Есть ли различия в инициализации перименных/объектов спосабами приведенными ниже? MXP>> int i(4); MXP>> int j = int(4); MXP>> int k = 4;
B>Для встроенных типов разницы нет. B>Для объектов пользовательских типов разница есть: B>Вариант 1 — непосредственная инициализация (direct initialization), вызывается "обычный" конструктор. B>Варианты 2 и 3 — инициализация копированием, для которой используется конструктор копирования (при этом аргумент при необходимости может быть неявно преобразован к типу инициализируемого объекта).
Не совсем так. Так получилось, что вчера только проверял такие конструкции на VC6 и BCB6 для реализованных типов — во всех случаях вызывается конструктор инициализации.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Не спорьте, Bell прав. Смотрите клаузу 8 стандарта. К тому же, Ваш обожаемый гурман Сатер писал про такое.
Не, я не спорю. Скорее всего, компиляторы не правы. Но то, что и тот и другой у меня во всех случаях вызывали конструктор инициализации — в этом нет сомнения. Если требуется. могу и код привести, но по-поему, вопрос не стои того.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Дело не в том, что они не правы, а в том, что им разрешены упрощения. Конечно, вопрос не особо важный. Кстати, раз уж речь о 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) А. Эйнштейн
ПК>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: для классов всегда объявлен конструктор копирования. Либо ПК>явно пользователем, либо неявно компилятором.
Где написано?
может быть разница для явно определенных кнструкторов и неявных
в отношении способа копирования?
Здравствуйте, 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"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен