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

时间:2015-08-13 02:52:33

标签: c++ arrays class c++11 initialization

// 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 ++参考文献但没有任何线索。

4 个答案:

答案 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) };

如果不清楚,请告诉我。

相关问题