gpt4 book ai didi

c++ - 使用类构造函数初始化类对象的指针?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:24:41 24 4
gpt4 key购买 nike

// 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++ 引用资料,但没有任何线索。

最佳答案

(请注意,这仅适用于 C++11 及更高版本)

baz = new Rectangle[2] { {2,5}, {3,6} };

此语法称为 list-initialization .

列表初始化聚合(如数组)结果(不出所料)aggregate initialization ,它将执行 copy-initialization在每个元素上;因为这里的初始化器本身是列表,所以这导致了copy-list-initialization

当您列表初始化一个(非聚合)类时,编译器会查找构造函数并选择最匹配的。如果所选的构造函数需要对任何参数进行缩小转换(例如 double -> int),或者如果它是一个显式 构造函数,因为copy-list-initializationcopy-initialization 的一种形式;只有 direct-initialization例如 Rectangle r{2, 5}; 可以使用 explicit 构造函数(尽管缩小转换仍然是一个错误)。

关于c++ - 使用类构造函数初始化类对象的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31978737/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com