Here there is a class with two private fields x and 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;
}
};
When initialization the array of Point objects as below, the output is ok;
Point array1[] = { (10), (20), { 30, 40 } };
Output;
First array
X = 10, Y = 1
X = 20, Y = 1
X = 30, Y = 40
However, if we initilize the Point array as below, the output is weird;
Point array2[] = { (10), (20), (30, 40) };
Output;
Second array
X = 10, Y = 1
X = 20, Y = 1
X = 40, Y = 1
Why (30,40) is not working for initialization of Point object?
Here is the complete test code;
#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;
}
And the complete output of test code;
..::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
Why (30, 40) is not working:
stating (30, 40)
is not the same as stating {30, 40}
nor stating (30)
is the same with {30}
.
(30, 40)
is a sequence of expressions (in this case integral literals), separated by comma operator, which evaluates to the last expression (i.e., 40
). Whereas, {30, 40}
in the context used is an aggregate initialization list.