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

时间:2009-09-14 20:22:08

标签: c++ constructor const ctor-initializer

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

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

class Foo;

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

class Foo {
public:
  int a;
};

欢迎提出任何建议。

6 个答案:

答案 0 :(得分:76)

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

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

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

答案 1 :(得分:18)

我相信你必须在初始化器中完成它。例如:

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

作为旁注,如果你永远不会改变foo指向的内容,请将其作为参考传递:

Foo& foo;

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

答案 2 :(得分:14)

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

答案 3 :(得分:6)

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

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

答案 4 :(得分:2)

使用参考:

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

然后,您可以在foo

中轻松引用Bar
foo.doSomething();

答案 5 :(得分:0)

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