Конструктор C++
Возможный дубликат:
Что это за странный синтаксис двоеточия в конструкторе?
Если я определю класс, как показано ниже в C++:
class myclass
{
public:
myclass (unsigned int param) : param_ (param)
{
}
unsigned int param () const
{
return param_;
}
private:
unsigned int param_;
};
Что означает определение конструктора:myclass (unsigned int param) : param_ (param)
значит а польза от кода?
2 ответа
myclass (unsigned int param) : param_ (param)
Эта конструкция называется списком инициализирующих элементов в C++.
Инициализирует ваш член param_
к стоимости param
,
В чем разница между инициализацией и назначением внутри конструктора? &
В чем преимущество?
Существует разница между инициализацией члена с использованием списка инициализаторов и присвоением ему значения внутри тела конструктора.
Когда вы инициализируете поля через список инициализаторов, конструкторы будут вызываться один раз.
Если вы используете присваивание, то поля будут сначала инициализированы конструкторами по умолчанию, а затем переназначены (через оператор присваивания) фактическими значениями.
Как вы видите, в последнем есть дополнительные издержки создания и назначения, которые могут быть значительными для пользовательских классов.
Для целочисленного типа данных (для которого вы его используете) или членов класса POD практических затрат нет.
Когда ты HAVE TO
использовать список инициализатора члена?
Вы будете вынуждены использовать список инициализаторов участников, если:
В вашем классе есть референтный член
В вашем классе есть постоянный член или
Ваш класс не имеет конструктора по умолчанию
Пример кода, который изображает HAVE TO
случаи:
class MyClass
{
public:
int &i; //reference member, has to be Initialized in Member Initializer List
int j;
const int k; //const member, has to be Initialized in Member Initializer List
MyClass(int a, int b, int c):i(a),j(b),k(c)
{
}
};
class MyClass2:public MyClass
{
public:
int p;
int q;
MyClass2(int x,int y,int z,int l,int m):MyClass(x,y,z),p(l),q(m)
{
}
};
int main()
{
int x = 10;
int y = 20;
int z = 30;
MyClass obj(x,y,z);
int l = 40;
int m = 50;
MyClass2 obj2(x,y,z,l,m);
return 0;
}
MyClass2
не имеет конструктора по умолчанию, поэтому его нужно инициализировать через список инициализаторов членов.
Преимущество вашего кода в том, что... ну что?! Это твой код. Преимущество в том, что он делает то, что говорит. По сравнению с какой альтернативой? Чтобы твой код был другим? Разные как?
myclass (unsigned int param) : param_ (param) {}
Двоеточие и следующий список ctor-initializer
(не называйте это "списком инициализаторов", что в C++ совершенно другое). Позволяет инициализировать элементы объекта.
Обратите внимание, что следующее не то же самое; Вы только назначаете участников после факта:
myclass (unsigned int param) {
param_ = param;
}
Это не будет действительно иметь значение в этом случае, с unsigned int
, но как только вы начинаете иметь дело с референтными членами и const
члены, и члены без конструктора по умолчанию, вы обнаружите, что вы должны инициализировать.