2016-06-26 2 views
4

Я столкнулся с этим кодом и понял, что не могу вспомнить тип используемой инициализации и его предполагаемое поведение.
Point p=(3,2); только кажется, передать последнее значение (2 в данном случае) в качестве аргумента конструктора, так что PrintOut показывает что-то вроде x=2 y=5, в отличие от ожидаемого x=3 y=2Невозможно определить тип инициализации

class Point{ 
public: 
    Point(int x=5,int y=5):a(x),b(y){}; 
    void printOut()const{ 
     cout<<"x= "<<a<<"y= "<<b<<endl;} 
private: 
    int a,b; 
}; 

void main(){ 
    Point p=(3,2); 
} 
+1

Используйте предупреждения своего компилятора. GCC дает мне * предупреждение: левый операнд оператора запятой не имеет эффекта *, которого достаточно для поиска оператора запятой и ответа на вопрос. – chris

ответ

4

Поскольку Point p = (3, 2); не вызывает конструктор с 2 аргументами, но называет его 1 аргументом, 2. Это связано с оператором , который в основном выдает результат первого выражения (3) и возвращает последний (2).

И поэтому конструктор вызывается с одним переданным аргументом, в этом случае 2 и используется аргумент по умолчанию, 5.

Если вы хотите вызвать конструктор с 2-мя аргументами, у вас есть несколько вариантов:

  • Point p(3, 2);
  • Point p = Point(3, 2);
  • Point p = { 3, 2 }; (C++ 11)
  • Point p{ 3, 2 }; (C++ 11)
1

Point p = (3,2) равнозначно Point p = 2, что, в свою очередь, совпадает с Point p = Point(2), следовательно, наблюдаемое поведение. Читайте в операторе запятой в C++.

Смежные вопросы