用大括号实例化一个c++对象

Instantiate an Object with curly braces C++

本文关键字:一个 c++ 对象 实例化      更新时间:2023-10-16

我读过很多关于用大括号初始化的解释:

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}

谢谢你的帮助

这种初始化方式叫做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。

auto ac1 = ArrayClass{};

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

ArrayClass ac1 = new ArrayClass();

是无效的,除非ArrayClass被定义为指针。不管怎样,new ArrayClass()在堆上分配的内存必须通过调用delete来显式地清理。

auto ac1 = ArrayClass{};

相同

ArrayClass ac1 = ArrayClass{};

是的。