3

同じパラメーターを持つプライベートコンストラクターでコンストラクターをオーバーロードできますか?

基本的に、何かが正の整数を格納する場合、パブリックコンストラクターでは正の整数が格納されていることを確認しますが、プライベートコンストラクターではチェックを実行しません。

明らかに、この例は実際には適切な使用法ではありませんが、メソッド内にオブジェクトを作成し、完全に安全な初期化を実行する時間を無駄にしたくない場合があります。後で再度実行する場合、または単に不要な場合は、特別なチェック(またはより慎重なヒープ割り当てや高価なもの)なしですぐに何かを作成するように指示することができます。クラス内のメソッドは同じパラメーターを持つ他のパブリックコンストラクターの代わりに、このコンストラクターを自動的に使用できます。

4

3 に答える 3

2

いいえ、パブリックコンストラクターまたは別のメンバー関数をプライベートコンストラクターでオーバーロードすることはできません。オーバーロード解決の目的でカウントされるのは、名前とパラメータータイプのみです。

探していることを実行するにはbool、パラメーターチェックを実行する必要があることを示す追加のパラメーターを受け取るプライベートコンストラクターを定義します。

class A {
public:
    A(int x) : A(x, true) {}
private:
    A(int x, bool check) {
        if (check) {
            // Perform the check of the x argument
        }
    }
};

インスタンスを構築してチェックをバイパスするには、プライベートコンストラクターにアクセスできる関数が呼び出します

A aUnchecked(-123, false);

チェックされたインスタンスは通常の方法で構築されます。

A aChecked(123);
于 2013-02-04T01:31:11.673 に答える
2

プライベートとパブリックのようにアクセスをオーバーロードすることはできませんが、シグニチャ(引数の数とそのタイプ)をオーバーロードすることはできます。

プライベートコンストラクタは非常に一般的です。

1つの使用法は、論理的に「削除された」コンストラクター(C ++ 11で最終的に直接サポートされる)用であり、もう1つは、パブリックファクトリ関数で使用するためのものです。


例:

class A
{
public:
    A( int const x)
    {
        // Whatever, checked construction.
        // Perform the check of the x argument.
        // Then other things.
        // In C++11 it can be done by checking x and forwarding to the
        // unchecked constructor in the same class. Not shown here though.
    }

private:
    enum unchecked_t { unchecked };
    A( int const x, unchecked_t )
    {
        // Unchecked construction.
    }

    // Methods that possibly use the unchecked constructor.
};
于 2013-02-04T01:35:50.450 に答える
1

プライベートコンストラクターを使用すると、クラスを直接インスタンス化することはできません。代わりに、ConstructorIdiomという名前の何かを使用しました。

継承したいクラスがコンストラクターにアクセスできないため、クラスを継承できない他のこと

あなたがすべきことは、コンストラクターから呼び出されてチェックするためにwamethodeを作成することです。

于 2013-02-04T01:36:58.870 に答える