C++类内初始化方式的选择细节

发布时间:2019-06-16 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了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,请注明来意。