C++ 类的const成员变量是否可以在方法而不是构造函数中初始化?

C++ 类的const成员变量是否可以在方法而不是构造函数中初始化?,c++,class,design-patterns,initialization,constants,C++,Class,Design Patterns,Initialization,Constants,我有一个类,想创建一个const int变量,但该变量的值在该类的构造函数中不可用 在类的初始化方法中,我得到值。我可以用那种方法分配吗? 因为我只分配了一次(正如const所说),为什么它不工作 代码如下[只是一个原型]: 文件:A.h Class A { private : const long int iConstValue; public : A(); initClassA(); } 文件:A.cpp A::A() { //CanNot initialize i

我有一个类,想创建一个const int变量,但该变量的值在该类的构造函数中不可用

在类的初始化方法中,我得到值。我可以用那种方法分配吗? 因为我只分配了一次(正如const所说),为什么它不工作

代码如下[只是一个原型]:

文件:A.h

Class A
{
  private :
  const long int iConstValue;

  public :
  A();
  initClassA();
}
文件:A.cpp

A::A()
{
 //CanNot initialize iConstValue (Don't have it)
}

A::initClassA(some params)
{
 // calculation according to params for iConstValue
 iConstValue = (some value)
}
这是行不通的。有人有办法吗


注意:I无法通过任何方式获取构造函数中iconstValue的值,因为存在一些限制。所以请不要建议这样做。

您不能这样做,因为您不能更改常量变量的值。当
initClassA
运行时,const数据成员已经初始化(在本例中为一些垃圾值)。因此,您只能将数据成员真正初始化为构造函数初始值设定项列表中的某个值

如果您只想设置变量一次,那么可以将其设为非常量,并添加一个保护,使其只能设置一次。这并不漂亮,但会起作用:

class A
{
  private :
   long int iValue;
   bool isInitialised;

  public :
  A() : iValue(0), isInitialized(false);
  bool initClassA() {
    if (isInitialized) return false;
    iValue = something:
    isInitialized = true;
    return true;
  }
}

但拥有可初始化或不可初始化的对象并不是一种好的做法。对象在构造时应处于一致状态,客户端不必检查这些对象是否已初始化。

const
并不意味着您只能分配一次,您永远不能分配给const对象。常量变量初始化一次,其值不能更改。所以你在构造函数中初始化它,当所有的成员和基都初始化后,你就不能再修改它了

如果在构造时无法获得值,可以将变量设为非常量,然后对其进行修改,或者可以使用占位符延迟构造,直到获得所有数据,直到构造真实对象

两阶段构造是一种代码味道,它肯定与const成员不兼容。

一个小例子:

class A
{
public:
  A():a(initial_value_of_a()) {}

private:
  const int a;
  int initial_value_of_a() { return 5; /* some computation here */ };
};

也许你能做的是,改变一个int指针,在你的构造函数中接收这个指针,然后在你想要的地方改变指针:p


但它的函数性将不同,因为它将是常量指针,不再是值:/

我认为我需要更改设计,我应该在构造函数中计算(或获取)常量变量值。因为我以后无法设置它的值。

“我只分配一次(正如const所说)”-const并没有说您可以分配一次。const表示您根本无法分配它(但可以初始化它)。赋值和初始化是不同的事情,您尝试的是赋值。为什么您的类需要
iConstValue
成为
const
?也许你的设计需要重新评估?那么课程设计就有缺陷了。你应该能够在构造函数中获取值,否则你有一个没有正确初始化的对象,而初始化是构造函数的工作。那么,还有什么替代方法呢,我希望类中有一个长整型,一旦赋值就不应该更改。@AnwarShaikh另一种方法是只允许常量访问变量。如果init函数被调用两次,我建议抛出一个异常,可能来自std::logic_error。在我的场景中,类有一个子类,该子类必须在其构造中实例化类对象。但child有一个原始数据(需要处理才能得到const值),所以我如何延迟父类的实例化。我不理解这个注释。什么类对象?什么是原始数据?你能把你的问题改清楚吗?您需要更改您的设计,为什么成员不能是非const?请不要添加“谢谢”作为答案。取而代之的是,投票选出你认为有用的答案。