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

t3h*_*iel 7 c++ initialization object

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

PhoneNumber homePhone = {858, 555, 1234};
Run Code Online (Sandbox Code Playgroud)

以及

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)
Run Code Online (Sandbox Code Playgroud)

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

auto ac1 = ArrayClass{};
Run Code Online (Sandbox Code Playgroud)

我习惯了

ArrayClass ac1 = new ArrayClass();
Run Code Online (Sandbox Code Playgroud)

首先是:

auto ac1 = ArrayClass{};
Run Code Online (Sandbox Code Playgroud)

同样的

ArrayClass ac1 = ArrayClass{};
Run Code Online (Sandbox Code Playgroud)

其次,

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

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

auto ac1 = ArrayClass{1,4,"hi", true}
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助

R S*_*ahu 5

这种初始化风格称为列表初始化。您可以在http://en.cppreference.com/w/cpp/language/list_initialization阅读更多相关信息。


我习惯做

ArrayClass ac1 = new ArrayClass();
Run Code Online (Sandbox Code Playgroud)

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

 ArrayClass* acPtr = new ArrayClass();
Run Code Online (Sandbox Code Playgroud)

首先是:

auto ac1 = ArrayClass{};
Run Code Online (Sandbox Code Playgroud)

一样

ArrayClass ac1 = ArrayClass{};
Run Code Online (Sandbox Code Playgroud)

是的,它是一样的。


其次,

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

是的。


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

auto ac1 = ArrayClass{1,4,"hi", true};
Run Code Online (Sandbox Code Playgroud)

您可以在以下情况下使用该语法:

ArrayClass具有至少四个成员,并且
所述第一构件可以使用初始化1并且
所述第二构件可使用被初始化4并且
第三部件可使用被初始化"hi"并且
该第四构件可使用被初始化true以及
任何其余成员可以是值初始化。

您可以在http://en.cppreference.com/w/cpp/language/value_initialization阅读有关值初始化的更多信息。


xax*_*xon 1

auto ac1 = ArrayClass{};
Run Code Online (Sandbox Code Playgroud)

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

ArrayClass ac1 = new ArrayClass();
Run Code Online (Sandbox Code Playgroud)

除非 ArrayClass 被类型定义为指针,否则无效。无论如何, new ArrayClass() 在堆上分配内存,必须通过调用delete它来显式清理该内存。

自动 ac1 = ArrayClass{};

ArrayClass ac1 = ArrayClass{};

是的。