当前位置: 首页 > 知识库问答 >
问题:

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

韩禄
2023-03-14

我知道在一堂课上

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个答案

公羊光明
2023-03-14

在这里,如果可以的话,您希望使用委托构造函数,或者可以在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));
}
宰父夕
2023-03-14

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

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

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

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

 类似资料:
  • 我有一个应用程序,大部分时间都在启动,但每7次左右启动它就会崩溃,出现错误: 我引用了这个,但最终出现了类似的错误 IndexOutOfBoundsException:空列表不包含索引1上的元素。 编辑2 null ViewModel

  • 下面的示例类无法编译: 此代码的编译错误消息是: 但是,对于包含以下方法的类,Java不会生成任何错误消息: 关于初始化及其要求,为什么Java对最终实例变量和最终局部变量的处理不同?谢谢

  • 我假设使用以下元素按以下顺序构建一个字节数组: 对称加密的AES密钥(对于AES 128有一个随机密钥,对于AES 128有一个随机初始化向量。在CBC模式下使用AES 128和PKCS5填充进行加密。在加密之前,文本用UTF-8进行编码) AES IV 加密消息(使用ECB模式下的RSA算法和PKCS1填充、先前生成的密钥和消息收件人的公钥) 我正在做的是获取每个参数的长度,以便创建新的byte

  • 问题内容: print语句导致以下编译时错误, 局部变量f可能尚未初始化 如果Java中的原语已经具有默认值(float = 0.0f) ,为什么需要定义一个? 所以这有效 感谢大家! 问题答案: 因为它是一个局部变量。这就是为什么什么都没有分配的原因: 局部变量略有不同。编译器永远不会为未初始化的局部变量分配默认值。如果您无法在声明它的地方初始化本地变量,请确保在尝试使用它之前为其分配一个值。访