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

假设我有一个 C + + 类 Foo 和一个类 Bar,它必须用一个构造函数创建,在这个构造函数中传递一个 Foo 指针,并且这个指针意味着在 Bar 实例生命周期中保持不变。做这件事的正确方法是什么?

事实上,我认为我可以像下面的代码一样编写,但是它不能编译。

class Foo;


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


class Foo {
public:
int a;
};

欢迎任何建议。

95096 次浏览

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

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

(注意,我重命名了传入变量以避免混淆。)

参考一下:

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

然后你可以很容易地在 Bar中参考 foo:

foo.doSomething();

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

初始化 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) {...}
};

我认为必须在初始化程序中进行。例如:

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

作为附注,如果你永远不会改变 foo 指向的东西,把它作为参考:

Foo& foo;


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