提问者:小点点

为什么C++中有不同的变量初始化方式?


自2011年C++标准修订版以来,变量可以通过下面给出的三种不同方式进行初始化。

int i = 0;
int i (0);
int i {0};

据我所知,所有三种不同的初始化都具有相同的效果。 如果它们都有相同的效果,为什么不像第一种那样坚持一种初始化方式呢? 在()或{}中包围变量的初始值,是否有任何特殊的需要来初始化变量?


共3个答案

匿名用户

不允许这三者中的任何一个的原因是为了保持向后兼容性。

在生产中,有大量的代码是用这三种方法编写的。 如果要更改标准,则需要重写工作代码,这会导致成本和可能的bug。 由于C++委员会对向后兼容性非常认真,所以我们最终落得这样的局面。 它仍然比Python等其他语言好得多,在Python中,从一个次要版本到另一个次要版本,您需要重写代码来格式化字符串,或者从0循环到10。

如果您可以选择,请选择{0},它称为统一初始化,原因是:-)

匿名用户

这是一个历史问题。 第一个是int i=0;。 这个是70年代早期的C语言。 接下来,第一个C++版本引入了一个类似于初始化语法的函数,在这里写int i(0);。 但是由于最令人烦恼的解析歧义,花括号初始化被发明了。

出于兼容性的原因,所有那些语法仍然有效。。。

匿名用户

int i = 0;
int i (0); //For backward compatibility
int i {0}; //Initializer list way

这3种类型的初始化是不同的。

int i = 2.2;
int i (2.2);
int i {2.2};

首先,two将执行隐式转换,但int i{0};将为参数缩小提供错误/警告。

有关初始值列表的详细信息,请查看此视频。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|中有|变量|初始化|方式)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?