В чем разница между этими двумя конструкторами?
В чем разница между этими двумя конструкторами?
int x, y; //position
BasePoint(int px, int py) : x(px), y(py) {}
а также
int x, y; //position
BasePoint(int px, int py)
{
x = px;
y = py;
}
Что такое x(px), y(py)
называется? И когда я использую этот тип инициализации переменной?
Благодарю.
3 ответа
Первый делает инициализацию с помощью initialization-list
, а второй выполняет присваивание с использованием оператора присваивания.
Первый рекомендуется!
BasePoint(int px, int py) : x(px), y(py) {}
^^^^^^^^^^^^^ this is called initialization-list!
Прочтите этот FAQ: Должны ли мои конструкторы использовать "списки инициализации" или "присваивание"?
Ответ на FAQ начинается с:
Списки инициализации. Фактически, конструкторы должны, как правило, инициализировать все объекты-члены в списке инициализации. Одно исключение обсуждается ниже [...]
Прочитайте полный ответ.
Как называется x(px), y(py)?
Это так называемые списки инициализаторов. На самом деле вы копируете значение px
в x
а также py
в y
,
Область применения:
class foo
{
private:
int numOne ;
public:
foo(int x):numOne(x){}
};
class bar : public foo
{
private:
int numTwo;
public:
bar(int numTwo): foo( numTwo ), // 1
numTwo(numTwo) // 2
{}
};
bar obj(10);
1. Обратите внимание, что аргумент производного конструктора может быть передан конструктору базового класса.
2. В этом случае компилятор может определить, какой из них является аргументом, а какой - переменной-членом. Если это нужно сделать в конструкторе, тогда -
bar::bar(int numTwo) : foo( numTwo)
{
this->numTwo = numTwo; // `this` needs to be used. And the operation is called assignment. There is difference between initialization and assignment.
}
BasePoint(int px, int py) : x(px), y(py) {}
здесь вы используете список инициализации, поэтому созданный объект не будет помещаться в тело и инициировать эти значения. он экономит время, не вводя в тело конструктора
Другое использование этого - при вызове конструктора производного класса.
где, если вы используете утверждение как
new derivedclass(a,b,c)
и ты можешь написать это
derivedclass(int x,int y,int z):baseclass(a,b),h(z){}