// pointer to classes example
// runs with no problem
#include <iostream>
using namespace std;
class Rectangle {
int width, height;
public:
Rectangle(int x, int y) : width(x), height(y) {}
int area(void) { return width * height; }
};
int main() {
Rectangle obj (3, 4);
Rectangle * foo, * bar, * baz;
foo = &obj;
bar = new Rectangle (5, 6);
baz = new Rectangle[2] { {2,5}, {3,6} };
cout << "obj's area: " << obj.area() << '\n';
cout << "*foo's area: " << foo->area() << '\n';
cout << "*bar's area: " << bar->area() << '\n';
cout << "baz[0]'s area:" << baz[0].area() << '\n';
cout << "baz[1]'s area:" << baz[1].area() << '\n';
delete bar;
delete[] baz;
return 0;
}
我有点(没有双关语)在这里对这行代码感到困惑:
baz = new Rectangle[2] {{2,5}, {3,6}};
我见过代码:
int *foo = new int[3] {1,2,3};
我完全明白了。但是{{2,5}, {3,6}}
的语法是什么?如何初始化类对象数组?我搜索了许多在线c ++参考文献但没有任何线索。
答案 0 :(得分:0)
只需使用初始化列表填充数组中的两个矩形。
想一想:
{2,5}, {3,6}
只需调用Rectangle {2,5},Rectangle {3,6}。
Rectangle
构造函数需要两个int
。
如果你看一下Rectangle obj (3, 4);
行
这也可能是Rectangle obj {3, 4};
答案 1 :(得分:0)
(请注意,这仅适用于C ++ 11及更高版本)
baz = new Rectangle[2] { {2,5}, {3,6} };
此语法称为list-initialization。
在aggregate initialization中列出初始化数组(如数组)的结果(不出所料),它将对每个元素执行copy-initialization;由于此处的初始化程序本身就是列表,因此会产生 copy-list-initialization 。
当您列出初始化(非聚合)类时,编译器会查找构造函数并选择最佳匹配。如果所选构造函数需要对任何参数进行缩小转换(例如double
- &gt; int
),或者它是{{1},则此时您将收到错误构造函数,因为 copy-list-initialization 是 copy-initialization 的一种形式;只有explicit
(例如Rectangle r{2, 5};
)可以使用explicit
构造函数(尽管缩小转化次数仍然是错误的。)
答案 2 :(得分:0)
使用C ++ 11,可以使用{x, y, z}
初始化对象实例。例如:
struct P2d {
double x, y;
};
void foo(P2d p);
void bar() {
foo({10, 20}); // Compiles fine
}
将它用于数组是可以的,对于简单的情况也是如此。在更复杂的情况下,它只会增加混淆,因为您只看到了值,但您不知道这些值的用途。
就像使用API一样
createWindow(0, 0, true, NULL, NULL, 1, NULL, false);
这些值是什么?
不要过度使用新的大括号初始化......有些情况下很棒:
// C++03
std::vector<int> list_of_values() {
std::vector<int> result;
result.push_back(1);
result.push_back(2);
result.push_back(3);
return result;
}
// C++11
std::vector<int> list_of_values() {
return {1, 2, 3};
}
但有些情况会让事情变得更糟:
{Rect(2, 3), Rect(4, 5)}
实际上比
更具可读性{{2, 3}, {4, 5}}
(请记住,阅读代码比编写代码时更轻松更重要... ...大多数代码行写入一次并多次读取)
答案 3 :(得分:-1)
baz = new Rectangle [2] {{2,5},{3,6}};
不可编辑。
甚至,
int * abc = new int[3] {1,2,3} ;
不可编辑。
如果您想使用非默认构造函数创建一个Rectangle类数组,请执行以下操作:
Rectangle baz[] = { Rectangle(2,5) , Rectangle(3,6) };
如果不清楚,请告诉我。