Про инициализацию перименных/объектов
От: 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: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[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 стандарта. К тому же, Ваш обожаемый гурман Сатер писал про такое.

Не, я не спорю. Скорее всего, компиляторы не правы. Но то, что и тот и другой у меня во всех случаях вызывали конструктор инициализации — в этом нет сомнения. Если требуется. могу и код привести, но по-поему, вопрос не стои того.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.