В чем разница между этими двумя конструкторами?

В чем разница между этими двумя конструкторами?

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){}
Другие вопросы по тегам