如何在构造函数中初始化一个常量字段?

想象一下,我有一个C ++类Foo和一个类Bar,必须使用构造函数创build一个Foo指针,并且该指针在Bar实例生命周期中保持不变。 什么是正确的做法呢?

事实上,我以为我可以写下面的代码,但它不编译..

class Foo; class Bar { public: Foo * const foo; Bar(Foo* foo) { this->foo = foo; } }; class Foo { public: int a; }; 

任何build议是值得欢迎的。

您需要在初始化程序列表中执行此操作:

 Bar(Foo* _foo) : foo(_foo) { } 

(请注意,我重命名传入的variables以避免混淆。)

我相信你必须在初始化程序中做到这一点。 例如:

 Bar(Foo* foo) : foo(foo) { } 

作为一个方面说明,如果你永远不会改变什么foo指向,通过它作为参考:

 Foo& foo; Bar(Foo& foo) : foo(foo) { } 

初始化const成员和其他特殊情况(如父类)可以在初始化程序列表中完成

 class Foo { private: const int data; public: Foo(int x) : data(x) {} }; 

或者,类似地,对于父代初始化

 class Foo { private: int data; public: Foo(int x) : data(x) {} }; class Bar : Foo { public: Bar(int x) : Foo(x) {} }; 

您需要在初始化程序列表中初始化foo。

 class Bar { Foo* const foo; public: Bar(Foo* f) : foo(f) {...} }; 

使用参考:

 Foo& foo; Bar(Foo& f) : foo(f) { } 

您可以在Bar轻松地引用foo

 foo.doSomething(); 

尝试: Bar(Foo* xfoo) : foo(xfoo) {}