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]: Про инициализацию перименных/объектов
От: Bell Россия  
Дата: 16.02.04 13:47
Оценка: 6 (1)
Здравствуйте, 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
ЗЗЫ
В некоторых ситуациях компилятор может оптимизировать инициализацию копированием за счет использования "более подходящего" конструктора. Но конструктор копирования все равно должен быть доступен.
Любите книгу — источник знаний (с) М.Горький
Re[3]: Про инициализацию перименных/объектов
От: Bell Россия  
Дата: 16.02.04 14:14
Оценка: :)
Здравствуйте, LaptevVV, Вы писали:

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


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

Смотреть здесь
Автор: Bell
Дата: 16.02.04
Любите книгу — источник знаний (с) М.Горький
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[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"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Про инициализацию перименных/объектов
От: MichaelXP  
Дата: 16.02.04 12:59
Оценка:
Есть ли различия в инициализации перименных/объектов спосабами приведенными ниже?
int i(4);
int j = int(4);
int k = 4;
Re: Про инициализацию перименных/объектов
От: maikLa Россия  
Дата: 16.02.04 13:05
Оценка:
Здравствуйте, MichaelXP, Вы писали:

MXP> Есть ли различия в инициализации перименных/объектов спосабами приведенными ниже?

MXP> int i(4);
MXP> int j = int(4);
MXP> int k = 4;

Нет. Во всех случаях будет вызван конструктор копирования (если говорить не только об int)
Re: Про инициализацию перименных/объектов
От: Lorenzo_LAMAS  
Дата: 16.02.04 13:06
Оценка:
MXP> Есть ли различия в инициализации перименных/объектов спосабами приведенными ниже?
MXP> int i(4);
MXP> int j = int(4);
MXP> int k = 4;

Длю увстроеннах типув — нет.
Of course, the code must be complete enough to compile and link.
Re: Про инициализацию перименных/объектов
От: Bell Россия  
Дата: 16.02.04 13:15
Оценка:
Здравствуйте, MichaelXP, Вы писали:

MXP> Есть ли различия в инициализации перименных/объектов спосабами приведенными ниже?

MXP> int i(4);
MXP> int j = int(4);
MXP> int k = 4;

Для встроенных типов разницы нет.
Для объектов пользовательских типов разница есть:
Вариант 1 — непосредственная инициализация (direct initialization), вызывается "обычный" конструктор.
Варианты 2 и 3 — инициализация копированием, для которой используется конструктор копирования (при этом аргумент при необходимости может быть неявно преобразован к типу инициализируемого объекта).
Любите книгу — источник знаний (с) М.Горький
Re[2]: Про инициализацию перименных/объектов
От: Vamp Россия  
Дата: 16.02.04 13:22
Оценка:
Gotcha!

MXP>> int i(4);

MXP>> int j = int(4);
MXP>> int k = 4;
B>Варианты 2 и 3 — инициализация копированием, для которой используется конструктор копирования

Найн! Между вариантами 1 и 3 разницы нет.
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Про инициализацию перименных/объектов
От: Bell Россия  
Дата: 16.02.04 13:29
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Gotcha!


MXP>>> int i(4);

MXP>>> int j = int(4);
MXP>>> int k = 4;
B>>Варианты 2 и 3 — инициализация копированием, для которой используется конструктор копирования

V>Найн! Между вариантами 1 и 3 разницы нет.

Ладно, уточню.
Если типы инициализируемого объекта и инициализатора совпадают, то разницы действительно нет — в обоих случаях будет использован констпуктор копии. В общем же случае варианты 1 и 3 — это не одно и то же.
Любите книгу — источник знаний (с) М.Горький
Re[3]: Про инициализацию перименных/объектов
От: Lorenzo_LAMAS  
Дата: 16.02.04 13:29
Оценка:
class A
{
public:
    A(int);
};

A a(4);
A a1 = 5;


Разница есть.
Of course, the code must be complete enough to compile and link.
Re[4]: Про инициализацию перименных/объектов
От: Vamp Россия  
Дата: 16.02.04 13:39
Оценка:
L_L>Разница есть.
Никакой.

#include <iostream>

struct A {
  A() {
    std::cout << "Default ctor" << std::endl;
  } 

  A(const A&) {
    std::cout << "Copy ctor" << std::endl;
  } 
  
  A(int) {
    std::cout << "int ctro" << std::endl;
  }
};

int main() {
    A a;
    
    A a1(a);
    
    A a2=a1;
    
    A a3=5;
    
    A a4(5);
}


Результат:

Default ctor
Copy ctor
Copy ctor
int ctro
int ctro

Да здравствует мыло душистое и веревка пушистая.
Re[4]: Про инициализацию перименных/объектов
От: Vamp Россия  
Дата: 16.02.04 13:40
Оценка:
B>Если типы инициализируемого объекта и инициализатора совпадают, то разницы действительно нет — в обоих случаях будет использован констпуктор копии. В общем же случае варианты 1 и 3 — это не одно и то же.
Разница только в синтаксисе.
Да здравствует мыло душистое и веревка пушистая.
Re[5]: Про инициализацию перименных/объектов
От: Bell Россия  
Дата: 16.02.04 13:48
Оценка:
Здравствуйте, Vamp, Вы писали:

B>>Если типы инициализируемого объекта и инициализатора совпадают, то разницы действительно нет — в обоих случаях будет использован констпуктор копии. В общем же случае варианты 1 и 3 — это не одно и то же.

V>Разница только в синтаксисе.
Это не так.
Любите книгу — источник знаний (с) М.Горький
Re[5]: Про инициализацию перименных/объектов
От: Lorenzo_LAMAS  
Дата: 16.02.04 13:50
Оценка:
Читай главу 8.
Of course, the code must be complete enough to compile and link.
Re[6]: Про инициализацию перименных/объектов
От: Vamp Россия  
Дата: 16.02.04 13:52
Оценка:
Гм...
В самом деле.
Был неправ.
Да здравствует мыло душистое и веревка пушистая.
Re[5]: Про инициализацию перименных/объектов
От: vgrigor  
Дата: 16.02.04 13:58
Оценка:
Здравствуйте, Vamp, Вы писали:

B>>Если типы инициализируемого объекта и инициализатора совпадают, то разницы действительно нет — в обоих случаях будет использован констпуктор копии. В общем же случае варианты 1 и 3 — это не одно и то же.

V>Разница только в синтаксисе.

Для невстроенных типов, где это вопрос имеет смысл,
— бывает определен оператор.=,
— конструктор,
— конструкотор копирования
— и побитовое копирование
и тогда при разном ситаксисе можно вызывать сочетания этих
вариантов, так что случаи могут быть разные.
Винтовку добудешь в бою!
Re[6]: Про инициализацию перименных/объектов
От: Bell Россия  
Дата: 16.02.04 14:00
Оценка:
Здравствуйте, vgrigor, Вы писали:

V>Для невстроенных типов, где это вопрос имеет смысл,

V> — бывает определен оператор.=,
V> — конструктор,
V> — конструкотор копирования
V> — и побитовое копирование
V>и тогда при разном ситаксисе можно вызывать сочетания этих
V>вариантов, так что случаи могут быть разные.


Эээ... можно подробней про побитовое копирование?
Любите книгу — источник знаний (с) М.Горький
Re[7]: Про инициализацию перименных/объектов
От: Lorenzo_LAMAS  
Дата: 16.02.04 14:01
Оценка:
B>Эээ... можно подробней про побитовое копирование?

нельзя, потому-что это выдумка Шилдта
Of course, the code must be complete enough to compile and link.
Re[7]: Про инициализацию перименных/объектов
От: vgrigor  
Дата: 16.02.04 14:05
Оценка:
B>Эээ... можно подробней про побитовое копирование?

Если у типа нет переопределенной операции =,
нет конструктора копирования,
то когда вы пишите =,
то имеется ввиду именно битовая копия.

Чего еще остается присваивать?
Винтовку добудешь в бою!
Re[2]: Про инициализацию перименных/объектов
От: LaptevVV Россия  
Дата: 16.02.04 14:07
Оценка:
Здравствуйте, 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 для реализованных типов — во всех случаях вызывается конструктор инициализации.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Про инициализацию перименных/объектов
От: Lorenzo_LAMAS  
Дата: 16.02.04 14:11
Оценка:
Не спорьте, Bell прав. Смотрите клаузу 8 стандарта. К тому же, Ваш обожаемый гурман Сатер писал про такое.
Of course, the code must be complete enough to compile and link.
Re[4]: Про инициализацию перименных/объектов
От: LaptevVV Россия  
Дата: 16.02.04 14:13
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

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

Не, я не спорю. Скорее всего, компиляторы не правы. Но то, что и тот и другой у меня во всех случаях вызывали конструктор инициализации — в этом нет сомнения. Если требуется. могу и код привести, но по-поему, вопрос не стои того.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Про инициализацию перименных/объектов
От: vgrigor  
Дата: 16.02.04 14:14
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

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


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

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

Как STL на сахаре из операторов.
Винтовку добудешь в бою!
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[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[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...
Пока на собственное сообщение не было ответов, его можно удалить.