Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不同形式的初始化_C++ - Fatal编程技术网

C++ 不同形式的初始化

C++ 不同形式的初始化,c++,C++,我在读Bjarne Stroustrup写的《C++之旅》一书,书中提到初始化基本上有两种方式: int a=5.2;//存储截断的值 int a{5.2};//编译器抛出错误 如您所见,后一种方法更安全,值得推荐 然而,我注意到: INTA(5.2) 也可以工作(与第二个版本不同,它不检查类型是否匹配) 那么,有人能解释一下第三种情况吗,我的意思是,它应该在什么时候使用,以及它与第一种情况有何不同。当你使用int a(5.2);您正在调用int的构造函数,它是一个初始化变量的C++方法。 这相

我在读Bjarne Stroustrup写的《C++之旅》一书,书中提到初始化基本上有两种方式:

int a=5.2;//存储截断的值

int a{5.2};//编译器抛出错误

如您所见,后一种方法更安全,值得推荐

然而,我注意到:

INTA(5.2)

也可以工作(与第二个版本不同,它不检查类型是否匹配)

那么,有人能解释一下第三种情况吗,我的意思是,它应该在什么时候使用,以及它与第一种情况有何不同。

当你使用int a(5.2);您正在调用int的构造函数,它是一个初始化变量的C++方法。 这相当于其他。 根据:

在C++中,初始化变量有三种方法。他们都是 相当于和都让人想起了语言在过去的演变 年份:

第一个是类c初始化(因为它是继承的) 从C语言中),包括在后面加一个等号 变量初始化为的值:

类型标识符=初始值;例如,要声明 键入名为x的int,并从相同的 一旦宣布,我们可以写:

int x = 0;
第二种方法称为构造函数初始化(由 C++语言,包含括号中的初始值 (()):

类型标识符(初始值);例如:

int x (0);
int x {0};
最后,第三种方法称为统一初始化,类似于 但是使用大括号({})而不是圆括号(这 通过C++标准的修订引入,2011):

类型标识符{初始值};例如:

int x (0);
int x {0};

如果它说的是两种,那么它可能意味着直接初始化和复制初始化。第二种方法和其他方法都是直接初始化。不过,这并不是说它们具有相同的语义。使用大括号表示法的一个原因是它避免了“最麻烦的解析”,即预期的变量声明被解释为函数声明。事实上,这通常更安全。使用C++03圆括号表示法的一个原因是,它不能错误地为您提供列表初始化,而且对于所谓的“缩小”转换,特别是对于枚举,它也不是那么模糊是一个非常可疑的东西,它更可能是一个打字错误,而不是一个真正的意图。顺便说一句,还有第四种方法,
inta={5.2}
如果用类替换int,则
ta(5.2)
调用构造函数并
ta=5.2
隐式调用同一个构造函数(如果构造函数标记为
explicit
,则该构造函数不起作用)。