本文主要是介绍深度探索C++ 对象模型(5)-Initialization list(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
以下四种情况,一定要使用成员初始化列表:
1.初始化一个引用成员
2.初始化一个const成员
示例代码为
class Shape{const int m_size; //const 常量int & m_ref; // reference memberfloat m_width;float m_height; public:Shape(int s, float w, float h) : m_size(s), m_ref(s) //只能在这初始化{m_size =s; //在初始化将出错m_width = w;m_height = h;}};
- 如果不对m_size和m_ref进行初始化,则会引起编译错误"E0366 “InitializationList::Shape::Shape(int s, float w, float h)” 未提供初始值设定项: ObjTest"
- 在构造函数中调用m_size=s;编译错误为"错误 C2166 左值指定 const 对象"
3.调用一个基类的构造函数,且这个构造函数需要传参
示例代码为
class A{public:A(int x); // A 的构造函数};class B : public A{ B(int x, int y) : A(x) // 必须在初始化表里调用基类 A 的构造函数,否则此行引起编译错误{ };};
如果不加": A(x)",则会引起编译错误"C2512 “InitializationList::A”: 没有合适的默认构造函数可用“
4.调用一个成员类的构造函数,且这个成员的构造函数要传参时
示例代码为
class A{public:A(int x); // A 的构造函数};class B{A m_a;B(int x, int y) : m_a(x) // 必须在初始化表里调用基类 A 的构造函数,否则此行引起编译错误{ }};
如果不加": m_a(x)",则会引起编译错误"C2512 “InitializationList::A”: 没有合适的默认构造函数可用“
【引用】
[1]<<深度探索C++ 对象模型 Inside The C++ Object Model >> Stanley B.Lippman 候捷 译
[2] 代码地址 https://github.com/thefistlei/cplusStudy.git
这篇关于深度探索C++ 对象模型(5)-Initialization list(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!