提问者:小点点

如何初始化需要执行计算的常量成员?


我知道在一堂课上

class A { 
     const int myint;
  public:
     A (const int yourint);
     A (const std::string yourstring);
};

我可以在初始值设定项列表中初始化myint,如下所示:

A::A (const int yourint) : myint (yourint) {};

但是,如果计算myint所需的数据来自字符串并且可能涉及计算,那么从第二个构造函数初始化myint的正确方法是什么?


共2个答案

匿名用户

在委托构造函数的成员初始化列表中使用函数调用:

A::A(std::string const& yourstring) : A(compute_myint(yourstring)) {};

通过const&传递std::string,而不仅仅是const

compute_myint可以是非成员、静态成员,可能无法从类外部访问,以最有意义的为准。

匿名用户

在这里,如果可以的话,您希望使用委托构造函数,或者可以在ctor中进行计算。关于第二个选项,请参阅我的第二个示例。您的类的一个示例是:

class A { 
     const int myint;
     static int parse_int(const std::string& string) {/*...*/}
  public:
     A (const int yourint) : myint{yourint};
     A (const std::string yourstring) : A{parse_int(yourstring)};
}

顺便说一下,因为parse_int只计算整数,所以它可以是static,这意味着它不需要使用类实例。当然,没有任何要求,因为函数也可以是成员(nonstatic),尽管static更安全,因为它几乎总是保证对象的构造。

该方法可用于任何C++版本。

class A { 
     const int myint;
     static int parse_int(const std::string& string) {/*...*/}
  public:
     A (const int yourint) : myint(yourint);
     A (const std::string yourstring) : my_int(parse_int(yourstring));
}