我知道在一堂课上
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
的正确方法是什么?
在委托构造函数的成员初始化列表中使用函数调用:
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));
}