C++中带括号的数组对象的初始化
Initialization of Array Objects With Parenthesis in C++
这里有一个 class 有两个私有字段 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
Why (30, 40) is not working:
声明 (30, 40)
与声明 {30, 40}
不同,声明 (30)
与 {30}
不同。
(30, 40)
是一系列表达式(在本例中为整数文字),由 comma operator, which evaluates to the last expression (i.e., 40
). Whereas, {30, 40}
in the context used is an aggregate initialization list.
分隔
编译器将 (30, 40)
作为带有逗号运算符的表达式,计算结果为单个数字 40
。您应该打开编译器警告以发现 30
被丢弃。
数组初始值设定项中带括号的表达式被视为表达式,而不是构造函数调用。您可以显式调用构造函数以消除歧义。
您代码中的括号让您感到困惑。当您编写 (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) }
这里有一个 class 有两个私有字段 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
Why (30, 40) is not working:
声明 (30, 40)
与声明 {30, 40}
不同,声明 (30)
与 {30}
不同。
(30, 40)
是一系列表达式(在本例中为整数文字),由 comma operator, which evaluates to the last expression (i.e., 40
). Whereas, {30, 40}
in the context used is an aggregate initialization list.
编译器将 (30, 40)
作为带有逗号运算符的表达式,计算结果为单个数字 40
。您应该打开编译器警告以发现 30
被丢弃。
数组初始值设定项中带括号的表达式被视为表达式,而不是构造函数调用。您可以显式调用构造函数以消除歧义。
您代码中的括号让您感到困惑。当您编写 (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) }