C++中带括号的数组对象的初始化

Posted

技术标签:

【中文标题】C++中带括号的数组对象的初始化【英文标题】:Initialization of Array Objects With Parenthesis in C++ 【发布时间】:2015-10-21 13:46:36 【问题描述】:

这里有一个类有两个私有字段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对象数组时,输出ok;

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) 作为一个带有逗号运算符的表达式,计算结果为单个数字40 @owacoder 可能没有。这正是正在发生的事情。 【参考方案1】:

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

声明(30, 40) 与声明30, 40 不同,声明(30) 与声明30 不同。

(30, 40) 是由comma operator 分隔的表达式序列(在本例中为整数文字),其计算结果为最后一个表达式(即40)。而在使用的上下文中,30, 40 是 aggregate initialization list。

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

所以对于第二个数组

(30, 40)

使用comma operator 所以

  10, 20, (30, 40) 

变成

  10, 20, 40 

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

 10, 20, Point(30, 40) 

【讨论】:

以上是关于C++中带括号的数组对象的初始化的主要内容,如果未能解决你的问题,请参考以下文章

数组必须用大括号括起来的初始化程序 c++ 初始化

C++11 中带或不带花括号的初始化差异

C++ - 尽管有括号列表初始化,但不能“新建”未知大小的数组?

初始化数组时使用(或不使用)括号

大括号之谜:C++的列表初始化语法解析

C++ 中聚合的带括号初始化的模板参数推导