Search code examples
c++arraysinitializationarray-initializationobject-initialization

Initialization of Array Objects With Parenthesis in C++


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

Solution

  • 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.