如何在类构造函数中使用类内声明的const常量?
类构造函数中使用类常量值的正确方式
你想要让无参构造函数通过委托调用带参构造函数,并传入类的默认常量值,但当前写法会导致传入的参数是未初始化的垃圾值。
错误代码示例:
class Foo{ public: Foo() : Foo(DEFAULT) {}; Foo(int num) : DEFAULT(4) { /*do something with num */}; const int DEFAULT; };
即使调整成员声明顺序,问题依然存在:
class Foo{ public: const int DEFAULT; Foo(int num) : DEFAULT(4) { /*do something with num */}; Foo() : Foo(DEFAULT) {}; };
问题原因
C++中使用委托构造时,被委托的构造函数负责所有成员变量的初始化,且成员的初始化顺序严格按照类中声明的顺序执行。你的写法里,DEFAULT是对象的成员常量,在无参构造委托带参构造时,DEFAULT还未被初始化,此时传入的DEFAULT是未定义的垃圾值;而带参构造初始化DEFAULT为4的操作,是在参数传递完成之后才执行的,因此num已经是无效值了。
解决方案
方案1:使用类静态常量(C++98及以上)
将DEFAULT定义为类的静态成员,它属于类本身,会在任何对象构造前完成初始化,这样委托构造时就能直接使用已初始化的常量值:
class Foo{ public: static const int DEFAULT; Foo() : Foo(DEFAULT) {}; Foo(int num) { // 可以正常使用num和DEFAULT }; }; // 类外初始化静态常量 const int Foo::DEFAULT = 4;
方案2:使用inline静态常量(C++11及以上)
C++11支持inline静态成员,无需在类外单独定义,写法更简洁:
class Foo{ public: inline static const int DEFAULT = 4; Foo() : Foo(DEFAULT) {}; Foo(int num) { // 可以正常使用num和DEFAULT }; };
方案3:直接传入字面量(简单场景备选)
如果不想使用静态成员,可以在无参构造中直接传入默认值字面量,同时在带参构造中初始化DEFAULT。缺点是默认值需要写两次,维护性稍差:
class Foo{ public: const int DEFAULT; Foo() : Foo(4) {}; Foo(int num) : DEFAULT(4) { // 使用num做操作 }; };
内容的提问来源于stack exchange,提问作者Matan
相关产品推荐
相关产品推荐

