4

最近、クラスの古い恐ろしい混乱を見ていました...簡単に言えば、1つのメンバーがconstであれば、スレッドセーフに役立ちます。
しかし問題は、メンバが ctor で初期化され、自明でない構造であることです。そのため、そのメンバー用の特別な init 関数を作成することを考えていました。それは良い決断ですか。小さな非常に単純な例(実際のコードは条件付きでいっぱいです:)とtry-s):

class ComplexInitList
{
std::pair<double,double> init_pair(const int first, const int second)
{
    if ((first == 0) || (second == 0))
       throw std::invalid_argument("div by 0");
    return std::make_pair(1.0/first, 1.0/second);
}
const std::pair<double,double> p;
public:
 ComplexInitList(int a, int b):p(init_pair(a,b))
{
    std::cout << p.first << ", " << p.second << std::endl;
}  
};
4

3 に答える 3

4

これは実際には、この問題に対する一般的で受け入れられている解決策です。可能であれば、init 関数を静的にすることを検討してください。これにより、構築中のオブジェクトに対する操作の予期しないセマンティクス (仮想呼び出しの動作など) が開始されなくなります。

于 2012-11-29T10:36:46.463 に答える
1

const データ メンバーを初期化するには、 で初期化するしかありませんmember initializer list

pconst であるため、値に初期化することはできますが、値を割り当てることはできません。概念的には、コンストラクターを呼び出すと、括弧内のコードが実行される前にオブジェクトが作成されます。したがってcalling ComplexInitList(int a, int b):p(init_pair(a,b))、プログラムは最初に member にスペースを割り当てますp

次に、プログラム フローは角かっこに入り、通常の割り当てを使用して、割り当てられたスペースに値を配置します。したがって、const データ メンバーを初期化する場合は、次のように初期化する必要があります。member initializer list

于 2012-11-29T10:42:35.453 に答える