Здравствуйте, 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, Вы писали:
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
ЗЗЫ
В некоторых ситуациях компилятор может оптимизировать инициализацию копированием за счет использования "более подходящего" конструктора. Но конструктор копирования все равно должен быть доступен.
Здравствуйте, 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 стандарта. К тому же, Ваш обожаемый гурман Сатер писал про такое.
Не, я не спорю. Скорее всего, компиляторы не правы. Но то, что и тот и другой у меня во всех случаях вызывали конструктор инициализации — в этом нет сомнения. Если требуется. могу и код привести, но по-поему, вопрос не стои того.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!