1

这里有一个类有两个私有字段 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
4

3 回答 3

5

为什么 (30, 40) 不起作用:

陈述(30, 40)与陈述不同,陈述{30, 40}与陈述(30)不同{30}

(30, 40)是一个表达式序列(在这种情况下是整数文字),由逗号运算符分隔,其计算结果为最后一个表达式(即,40)。而{30, 40}在使用的上下文中是聚合初始化列表

于 2015-10-21T13:56:04.833 回答
5

编译器将(30, 40)计算结果为单个数字的逗号运算符作为表达式40。您应该打开编译器警告以发现30被丢弃。

数组初始值设定项中带括号的表达式被视为表达式,而不是构造函数调用。您可以显式调用构造函数来消除歧义。

于 2015-10-21T13:58:21.707 回答
4

代码中的括号使您感到困惑。当你写(10)这并不意味着调用一个参数为 10 的构造函数。 (10)变成 10,你可以用

Point array1[] = { 10, 20, { 30, 40 } };

所以对于第二个数组

(30, 40)

使用逗号运算

 { 10, 20, (30, 40) }

变成

 { 10, 20, 40 }

如果你想调用两个参数的构造函数,你必须像第一个例子一样将它括起来或者显式调用构造函数

{ 10, 20, Point(30, 40) }
于 2015-10-21T13:59:12.793 回答