脚本宝典收集整理的这篇文章主要介绍了C++类内初始化方式的选择细节,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
以下所有栗子未经特殊说明,全部实现于C++11下
初始化方式
在C++中有很多种初始化方式,如下栗子
string s0; // 默认初始化
string s1(s0); // 拷贝初始化
string s2("Hello World!"); // 直接初始化
string s3{"Hello World!"}; // 列表初始化
string s4 = "Hello World!"; // 拷贝初始化
string s5(10, '*'); // 直接初始化
string s6 = s0; // 拷贝初始化,等价于 s1(s0)
注意: 列表初始化作为C++11的一部分,现在得到全面的应用。但是在这之前,使用花括号这种初始化形式只能应用于一些场合下。
但是如果我们使用列表初始化,初始值存在丢失的风险,那么将会直接报错
double banana = 1.23456789;
int apple{ banana }; // 错误,丢失了部分精度
inr orange(banana); // 成功,但是丢失了精度
重现
考虑以下类的声明
class test {
string s("Hello World")
};
这在编译时会发生一个错误,错误信息为
error: expected identifier before string constant
error: exPEcted ‘,’ or ‘...’ before string constant
分析 && 结论
报错的原因是对类内初始值的限制,在提供类内初始值(C++11)时,不能使用直接初始化的方式。简单点说,就是不能使用圆括号直接进行类内初始化,其他几种方式都没问题,甚至你可以使用以下方式
class Test {
string s = string("Hello World"); // 拷贝初始化
}
举一反三
考虑下面栗子,有哪些错误
class Base1 {
string s;
public:
Base1(string &source) : s(source) {}
};
class Base2 {
string s;
public:
Base2(string source) : s(source) {}
};
class Test {
Base1 b1 = Base1("Hello World");
Base2 b2 = Base2("Hello World");
Base2 b3("Hello World");
};
以上是脚本宝典为你收集整理的C++类内初始化方式的选择细节全部内容,希望文章能够帮你解决C++类内初始化方式的选择细节所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。