3

C++ のコンストラクターについていくつか質問があります。各質問 ((1) から (4) まで) について、動作が標準に関して完全に定義されているかどうかを知りたいです。

A) 最初のものはメンバーの初期化についてです:

class Class
{
    public:
        Class() 
        : _x(0)
        , _y(_x)
        , _z(_y) // <- (1) Can I initialize a member with other members ?
        {
            ;
        }

    protected:
        int _x;
        int _y;
        int _z;
};

B) コンパイラによって各クラスに追加された関数は何ですか?

template<typename T> class Class
{
    public:
        template<typename T0>
        Class(const Class<T0>& other)
        {
            std::cout<<"My copy constructor"<<std::endl;
            _x = other._x;   
        }

        template<typename T0 = T>
        Class (const T0 var = 0)
        {
            std::cout<<"My normal constructor"<<std::endl;
            _x = var;
        }

    public:
        T _x;
};

// (2) Are 
// Class(const Class<T>& other) 
// AND 
// inline Class<T>& operator=(const Class<T>& other)
// the only functions automatically added by the compiler ?

例として、私が呼び出すと:

Class<int> a;
Class<int> b(a); // <- Will not write "My copy constructor"
Class<double> c(a); // <- Will write "My copy constructor"

(3) この動作は、標準に従って完全に正常ですか?

(4) 空のコンストラクターが自動的に追加されず、それClass<int> x;が書き込みを行うという保証はあります"My normal constructor"か?

4

1 に答える 1

6

メンバーを他のメンバーで初期化できますか?

はい、それらの他のメンバーがすでに初期化されている限り、つまり、メンバーが初期化される前に宣言が行われる限りです。

[コピーコンストラクター]と[コピー代入演算子]だけがコンパイラーによって自動的に追加される関数ですか?

また、デストラクタを暗黙的に宣言し、デストラクタを_x使用して破棄します。

C ++ 11では、コピーまたはムーブコンストラクター、またはコピーまたはムーブ代入演算子を宣言しない限り、ムーブコンストラクター(Class(Class&&))およびムーブ代入演算子(Class& operator=(Class&&))も暗黙的に宣言されます。

コンストラクターテンプレートはコピーコンストラクターではなく、代わりに暗黙的なテンプレートが使用されることに注意してください。

Class<T1> t1;
Class<T1>(t1); // prints nothing
Class<T2>(t1); // prints "My copy constructor" (which is a lie)

この動作は、標準に従って完全に正常ですか?

はい、第12章を参照してください。

空のコンストラクターが自動的に追加されず、Class<int> x;書き込みが行われるという保証はあります"My normal constructor"か?

はい、デフォルトのコンストラクターは、コンストラクターをまったく宣言しない場合にのみ暗黙的に宣言されます。

于 2012-11-14T04:09:53.077 に答える