用花括号C ++实例化一个Object

时间:2016-10-06 04:58:34

标签: c++ object initialization

我已经阅读了许多关于用大括号初始化的解释:

PhoneNumber homePhone = {858, 555, 1234};

以及

int x2 = val; // if val==7.9, x2 becomes 7 (bad)

char c2 = val2; // if val2==1025, c2 becomes 1 (bad)

int x3 {val}; // error: possible truncation (good)

char c3 {val2}; // error: possible narrowing (good)

char c4 {24}; // OK: 24 can be represented exactly as a char (good)

char c5 {264}; // error (assuming 8-bit chars): 264 cannot be 
               // represented as a char (good)

但是,我在这里遇到了一些代码,我找不到一个例子,也许我不知道这个术语,所以我可以谷歌吧:

auto ac1 = ArrayClass{};

我习惯做

ArrayClass ac1 = new ArrayClass();

首先是:

auto ac1 = ArrayClass{};

相同
ArrayClass ac1 = ArrayClass{};

其次,

如果我在构造函数中使用了初始化列表,我是否只允许使用大括号?

最后,如果我有参数,以下是否正确?

auto ac1 = ArrayClass{1,4,"hi", true}

感谢您的帮助

2 个答案:

答案 0 :(得分:4)

这种初始化方式称为 list-initialization 。您可以在http://en.cppreference.com/w/cpp/language/list_initialization了解更多信息。

  

我习惯做

ArrayClass ac1 = new ArrayClass();

这不是正确的C ++语法。您可以使用:

 ArrayClass* acPtr = new ArrayClass();
  

首先是:

auto ac1 = ArrayClass{};
     

相同
ArrayClass ac1 = ArrayClass{};

是的,它是一样的。

  

其次,

     

如果我在构造函数中使用了初始化列表,我是否只允许使用大括号?

  

最后,如果我有参数,以下是否正确?

auto ac1 = ArrayClass{1,4,"hi", true};

如果符合以下条件,您可以使用该语法:

ArrayClass至少有四名成员,
可以使用1来初始化第一个成员 可以使用4来初始化第二个成员 可以使用"hi"来初始化第三个成员 可以使用true来初始化第四个成员 任何其他剩余成员都可以初始化值。

您可以在http://en.cppreference.com/w/cpp/language/value_initialization阅读更多aboue 值初始化

答案 1 :(得分:1)

auto ac1 = ArrayClass{};

在堆栈上分配,当堆栈消失时,变量会自动清除。

ArrayClass ac1 = new ArrayClass();

无效,除非ArrayClass是typedef'd指针。无论如何,新的ArrayClass()在堆上分配必须通过调用delete来明确清理的内存。

  

auto ac1 = ArrayClass {};

     

相同      

ArrayClass ac1 = ArrayClass {};