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

问题描述 投票:0回答:7

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

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

class Foo;

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

class Foo {
public:
  int a;
};

欢迎任何建议。

c++ constructor constants ctor-initializer
7个回答
105
投票

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

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

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


24
投票

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

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

顺便说一句,如果您永远不会更改 foo 指向的内容,请将其作为参考传递:

Foo& foo;

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

18
投票

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

6
投票

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

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

0
投票

使用参考:

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

您可以在

foo
中轻松参考
Bar

foo.doSomething();

0
投票

尝试:

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


0
投票

如果在设置成员之前需要一些计算,请使用 const_cast:

class Bar {
public:
    Foo * const foo;
    Bar(Foo* foo) :foo(null_ptr) {
        //some calculations ...
        const_cast<Foo * &>(this->foo) = foo;
    }
};
© www.soinside.com 2019 - 2024. All rights reserved.