Здесь есть класс с двумя приватными полями x и y;
class Point
{
private:
int x, y;
public:
Point(int = 1,int = 1);
void move(int, int);
void print()
{
cout << "X = " << x << ", Y = " << y << endl;
}
};
При инициализации массива объектов Point, как показано ниже, вывод в порядке;
Point array1[] = { (10), (20), { 30, 40 } };
Выход;
First array
X = 10, Y = 1
X = 20, Y = 1
X = 30, Y = 40
Однако, если мы инициализируем массив Point, как показано ниже, результат будет странным;
Point array2[] = { (10), (20), (30, 40) };
Выход;
Second array
X = 10, Y = 1
X = 20, Y = 1
X = 40, Y = 1
Почему (30,40) не работает для инициализации объекта Point?
Вот полный тестовый код;
#include <iostream>
using namespace std;
class Point
{
private:
int x, y;
public:
Point(int = 1,int = 1);
void move(int, int);
void print()
{
cout << "X = " << x << ", Y = " << y << endl;
}
};
Point::Point(int x, int y)
{
cout << "..::Two Parameter Constructor is invoked::..\n";
this->x = x;
this->y = y;
}
void Point::move(int x, int y)
{
this->x = x;
this->y = y;
}
int main()
{
// Point array1[] = { Point(10), Point(20), Point(30, 40) };
// Use parenthesis for object array initialization;
Point array1[] = { (10), (20), { 30, 40 } }; // curly bracket used for two parameter
Point array2[] = { (10), (20), (30, 40) }; // paranthesis used for all objects
cout << "First array" << endl;
for (int i = 0; i < 3; i++)
array1[i].print();
cout << "Second array" << endl;
for (int i = 0; i < 3; i++)
array2[i].print();
return 0;
}
И полный вывод тестового кода;
..::Two Parameter Constructor is invoked::..
..::Two Parameter Constructor is invoked::..
..::Two Parameter Constructor is invoked::..
..::Two Parameter Constructor is invoked::..
..::Two Parameter Constructor is invoked::..
..::Two Parameter Constructor is invoked::..
First array
X = 10, Y = 1
X = 20, Y = 1
X = 30, Y = 40
Second array
X = 10, Y = 1
X = 20, Y = 1
X = 40, Y = 1
Почему (30, 40) не работает:
о том, (30, 40)
это не то же самое, что заявить {30, 40}
ни констатируя (30)
то же самое с {30}
,
(30, 40)
является последовательностью выражений (в данном случае целочисленных литералов), разделенных оператор запятой, который вычисляется до последнего выражения (т.е. 40
). В то время как, {30, 40}
в контексте используется совокупный список инициализации.
Компилятор берет (30, 40)
как выражение с оператором запятой, который оценивает одно число 40
, Вы должны включить предупреждения компилятора, чтобы найти, что 30
отбрасывается
Заключенные в скобки выражения в инициализаторах массива принимаются как выражения, а не вызовы конструктора. Вы можете вызвать конструктор явно, чтобы устранить неоднозначность.
Паренатез в вашем коде вызывает у вас путаницу. Когда ты пишешь (10)
это не значит вызывать конструктор с параметром 10. (10)
становится 10, и вы можете увидеть, что с
Point array1[] = { 10, 20, { 30, 40 } };
Так что для второго массива
(30, 40)
Использует оператор запятой так
{ 10, 20, (30, 40) }
становится
{ 10, 20, 40 }
Если вы хотите вызвать два параметра constrcutor, вам придется заключить его в скобки, как в первом примере, или явно вызвать конструктор
{ 10, 20, Point(30, 40) }