使用花括号在C++中实例化一个对象

14

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

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个回答

9

这种初始化方式被称为列表初始化。您可以在http://en.cppreference.com/w/cpp/language/list_initialization上阅读更多内容。


I am used to doing

ArrayClass ac1 = new ArrayClass();

那不是正确的C++语法。您可以使用以下方式:

 ArrayClass* acPtr = new ArrayClass();

First of all is:

auto ac1 = ArrayClass{};

the same as

ArrayClass ac1 = ArrayClass{};

是的,它们是一样的。


其次,

如果我在构造函数中使用了初始化列表,那么我只能使用大括号吗?

是的。


And lastly, if I have parameters, is the following correct?

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

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

ArrayClass 至少有四个成员,并且
第一个成员可以使用 1 进行初始化,并且
第二个成员可以使用 4 进行初始化,并且
第三个成员可以使用 "hi" 进行初始化,并且
第四个成员可以使用 true 进行初始化,并且
其余的成员可以进行值初始化。

您可以在 http://en.cppreference.com/w/cpp/language/value_initialization 上了解更多关于值初始化的信息。


那个链接的文档对于一个C++新手来说几乎是不可能理解的,就算是人类也很难。 - RichieHH

1
auto ac1 = ArrayClass{};

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

ArrayClass ac1 = new ArrayClass();

如果ArrayClass没有typedef为指针,则无效。不管怎样,new ArrayClass()在堆上分配内存,必须通过调用delete来明确清理。

auto ac1 = ArrayClass{};

ArrayClass ac1 = ArrayClass{};相同;

是的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接