Инициализация объектов массива с круглыми скобками в переполнении стека

Здесь есть класс с двумя приватными полями 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

1

Решение

Почему (30, 40) не работает:

о том, (30, 40) это не то же самое, что заявить {30, 40} ни констатируя (30) то же самое с {30},

(30, 40) является последовательностью выражений (в данном случае целочисленных литералов), разделенных оператор запятой, который вычисляется до последнего выражения (т.е. 40). В то время как, {30, 40} в контексте используется совокупный список инициализации.

5

Другие решения

Компилятор берет (30, 40) как выражение с оператором запятой, который оценивает одно число 40, Вы должны включить предупреждения компилятора, чтобы найти, что 30 отбрасывается

Заключенные в скобки выражения в инициализаторах массива принимаются как выражения, а не вызовы конструктора. Вы можете вызвать конструктор явно, чтобы устранить неоднозначность.

5

Паренатез в вашем коде вызывает у вас путаницу. Когда ты пишешь (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) }
4