Re[3]: Про инициализацию перименных/объектов
От: Bell Россия  
Дата: 16.02.04 14:14
Оценка: :)
Здравствуйте, LaptevVV, Вы писали:

LVV>Не совсем так. Так получилось, что вчера только проверял такие конструкции на VC6 и BCB6 для реализованных типов — во всех случаях вызывается конструктор инициализации.


Сопротивление продожается?

Смотреть здесь
Автор: Bell
Дата: 16.02.04
Любите книгу — источник знаний (с) М.Горький
Re[4]: Про инициализацию перименных/объектов
От: vgrigor  
Дата: 16.02.04 14:14
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Не спорьте, Bell прав. Смотрите клаузу 8 стандарта. К тому же, Ваш обожаемый гурман Сатер писал про такое.


Жаль гурманство часто кривое бывает.

С другой стороны, иногда ну очень полезное.

Как STL на сахаре из операторов.
Винтовку добудешь в бою!
Re[5]: Про инициализацию перименных/объектов
От: Павел Кузнецов  
Дата: 16.02.04 14:14
Оценка: 20 (2)
Здравствуйте, 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"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[5]: Про инициализацию перименных/объектов
От: Lorenzo_LAMAS  
Дата: 16.02.04 14:19
Оценка:
Дело не в том, что они не правы, а в том, что им разрешены упрощения. Конечно, вопрос не особо важный. Кстати, раз уж речь о VC 6.0 — прикольно, он оптимизирует (выбрасывает лишнее копирование в некоторых случаях) только при наличии нетривиального деструктора.
Of course, the code must be complete enough to compile and link.
Re[8]: Про инициализацию перименных/объектов
От: Кодт Россия  
Дата: 16.02.04 14:19
Оценка:
Здравствуйте, 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);
}
Перекуём баги на фичи!
Re[9]: Про инициализацию перименных/объектов
От: Lorenzo_LAMAS  
Дата: 16.02.04 14:26
Оценка:
К>Отнюдь. Если у объекта нет переопределённого конструктора копирования и переопределённого же оператора присваивания — компилятор определит по умолчанию почленное копирование/присваивание соответственно.
В случае тривиальных оператора присваивани/конструктора копирования компилятор не сгенерирует их определения. Будет происходить почленное присваивание, которое 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.
Re[10]: Про инициализацию перименных/объектов
От: vgrigor  
Дата: 16.02.04 14:39
Оценка:
Здравствуйте, 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"
Винтовку добудешь в бою!
Re[11]: Про инициализацию перименных/объектов
От: WolfHound  
Дата: 16.02.04 14:51
Оценка:
Здравствуйте, 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) А. Эйнштейн
Re[12]: Про инициализацию перименных/объектов
От: vgrigor  
Дата: 16.02.04 14:55
Оценка:
WH>2)Это лищь оптимизация проводимая конкретным компилятором.

такие вещи делаются по стандарту С++,
а не пожеланию МС.

Это чисто алгоритм работы языка.
Винтовку добудешь в бою!
Re[11]: Про инициализацию перименных/объектов
От: Bell Россия  
Дата: 16.02.04 14:56
Оценка: +1
Здравствуйте, 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).


Как видишь, побитовое копирование не упоминается.
Любите книгу — источник знаний (с) М.Горький
Re[13]: Про инициализацию перименных/объектов
От: WolfHound  
Дата: 16.02.04 15:00
Оценка:
Здравствуйте, vgrigor, Вы писали:

V>такие вещи делаются по стандарту С++,

V>а не пожеланию МС.
Наивный...
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[13]: Про инициализацию перименных/объектов
От: Bell Россия  
Дата: 16.02.04 15:01
Оценка:
Здравствуйте, vgrigor, Вы писали:


WH>>2)Это лищь оптимизация проводимая конкретным компилятором.


V>такие вещи делаются по стандарту С++,

V>а не пожеланию МС.

Ну, это сильно сказано. Известны случаи , когда пожелания МС и стандарт языка несколько не совпадали.

V>Это чисто алгоритм работы языка.

Ы?
Любите книгу — источник знаний (с) М.Горький
Re[6]: Про инициализацию перименных/объектов
От: LaptevVV Россия  
Дата: 16.02.04 15:02
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Здравствуйте, 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;
ПК>          ^
ПК>

Как всегда, самый аргументированный ответ! Спасибо!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[11]: Про инициализацию перименных/объектов
От: Павел Кузнецов  
Дата: 16.02.04 15:06
Оценка: +1
Здравствуйте, 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"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[12]: Про инициализацию перименных/объектов
От: vgrigor  
Дата: 16.02.04 15:12
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Здравствуйте, 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: для классов всегда объявлен конструктор копирования. Либо
ПК>явно пользователем, либо неявно компилятором.

Где написано?

может быть разница для явно определенных кнструкторов и неявных
в отношении способа копирования?
Винтовку добудешь в бою!
Re[13]: Про инициализацию перименных/объектов
От: Павел Кузнецов  
Дата: 16.02.04 15:27
Оценка:
Здравствуйте, 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"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.