Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Инициализация. В чем Profit?

11
06 декабря 2011 года
oxotnik333
2.9K / / 03.08.2007
 
Код:
class CSomeClass
{
    CSomeClass();
private:
    bool isState1, isState2;
};

Инициализация членов:
 
Код:
// 1-й вар.
CSomeClass::CSomeClass()
: isState1(true), isState2(false)
{
}


 
Код:
//2-й
CSomeClass::CSomeClass()
{
    isState1 = true;
    isState2 = false;
}

Какой способ предпочтительней? Какие подводные камни могут где встетится? На мой взгляд монопенисуально. А что скажут профи?
316
06 декабря 2011 года
Alm3n
889 / / 29.05.2009
Разве 1-й вариант - это не передача параметров в конструкторы базовых классов, а не инициализация, если CSomeClass - это derived?
341
06 декабря 2011 года
Der Meister
874 / / 21.12.2007
В данном конкретном случае абсолютно всё равно, но вообще, в первом случае, переменные-члены инициализируются конструктором или конструктором копирования, во втором - конструктором копирования или оператором присваивания. В C++ они отличаются и это важно.
316
06 декабря 2011 года
Alm3n
889 / / 29.05.2009
Цитата: Der Meister
В данном конкретном случае абсолютно всё равно, но вообще, в первом случае, переменные-члены инициализируются конструктором или конструктором копирования, во втором - конструктором копирования или оператором присваивания.


Где об этом есть почитать?

11
06 декабря 2011 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Alm3n
Разве 1-й вариант - это не передача параметров в конструкторы базовых классов, а не инициализация, если CSomeClass - это derived?


Здесь просто класс... ничего более

9
06 декабря 2011 года
Lerkin
3.0K / / 25.03.2003
Der Meister - самый правдивый гуру. И если маразм мне не изменяет, то действительно, встроенным типам вид инициализации - до фени, а для пользовательских (struct, сlass) - уже важно, и рекомендуется это через конструктор, ибо можно (незаметно) намутить с перегрузкой операторов.
11
06 декабря 2011 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Lerkin
а для пользовательских (struct, сlass) - уже важно, и рекомендуется это через конструктор, ибо можно (незаменто) намутить с перегрузкой операторов.


То бишь не через список инициализации а в конструкторе по 2-му варианту?

9
06 декабря 2011 года
Lerkin
3.0K / / 25.03.2003
Цитата: oxotnik333
То бишь не через список инициализации а в конструкторе по 2-му варианту?


В твоём случае, isState1 и isState2 - встроенного типа, поэтому - как хошь. Если бы было class isState1 и class isState2 - тогда списком.

341
06 декабря 2011 года
Der Meister
874 / / 21.12.2007
Цитата: Lerkin
Der Meister - самый правдивый гуру.

Не самый, потому что пропёрся и лишнего вписал: в первом случае будет вызван конструктор либо конструктор копирования, во втором - только опрератор присваивания, со всеми вытекающими. Например, если потребуется инициализировать переменную перегруженным конструктором, то в результате присваивания произойдёт создание анонимного объекта и копирование его с помощью оператора присваивания, в то время как инициализатор вызовет конструктор переменной напрямую. Некоторые переменным-членам вообще нельзя присваивать значения, их можно только инициализировать - ссылки и константы яркий тому пример. Если тип переменной не имеет конструктора по умолчанию (без параметров), то без инициализатора программа так же не скомпилируется. И даже в случае простого копирования параметра в переменную-член, реализация конструктора копирования и оператора присваивания могут не совпадать (это, в частности, может быть актуально для каких-нибудь умных указателей).
Ну и напомню, на всякий: инициализация происходит не в порядке написания инициализаторов, а в порядке объявления переменных-членов.
А вот где почитать помимо стандарта - не знаю. Да и в стандарте, если честно, пока не смотрел :)

260
06 декабря 2011 года
Ramon
1.1K / / 16.08.2003
Цитата: oxotnik333
 
Код:
class CSomeClass
{
    CSomeClass();
private:
    bool isState1, isState2;
};

Инициализация членов:
 
Код:
// 1-й вар.
CSomeClass::CSomeClass()
: isState1(true), isState2(false)
{
}


 
Код:
//2-й
CSomeClass::CSomeClass()
{
    isState1 = true;
    isState2 = false;
}

Какой способ предпочтительней? Какие подводные камни могут где встетится? На мой взгляд монопенисуально. А что скажут профи?



Предпочтительнее №1 ибо используя C++ используйте C++, не забывая в более сложных случаях и об исключениях.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог