1. ホーム
  2. c++

[解決済み] C++、コンストラクタの後のコロンはどういう意味ですか?[重複]です。

2022-01-30 01:09:52

質問

<ブロッククオート

重複の可能性があります。
コンストラクタのコロンの後の変数
C++のコンストラクタの構文に関する質問 (noob)

私はここにいくつかのC++のコードを持っています。

class demo 
{
private:
    unsigned char len, *dat;

public:
    demo(unsigned char le = 5, unsigned char default) : len(le) 
    { 
        dat = new char[len];                                      
        for (int i = 0; i <= le; i++)                             
            dat[i] = default;
    }

    void ~demo(void) 
    {                                            
        delete [] *dat;                                           
    }
};

class newdemo : public demo 
{
private:
    int *dat1;

public:
    newdemo(void) : demo(0, 0)
    {
     *dat1 = 0;                                                   
     return 0;                                                    
    }
};

質問なのですが : len(le): demo(0, 0) が呼び出されるのですか?

継承に関わることなのでしょうか?

解決方法は?

他の方もおっしゃっていますが、初期化リストです。2つのことに使えます。

  1. ベースクラスのコンストラクタを呼び出す
  2. コンストラクタ本体が実行される前に、メンバ変数を初期化する。

ケース1について、あなたは継承を理解していると思います(そうでない場合は、コメントで教えてください)。つまり、単にベースクラスのコンストラクタを呼び出しているだけなのです。

ケース 2 では、「なぜコンストラクタの本体で初期化しないのか」という疑問が湧くかもしれません。 const メンバになります。例えば、次のような状況を見てみましょう。 m_val コンストラクタのパラメータを元に

class Demo
{
    Demo(int& val) 
     {
         m_val = val;
     }
private:
    const int& m_val;
};

C++の仕様では、これは違法です。の値を変更することはできません。 const 変数はコンストラクタで使用されます。そこで、初期化リストを使用することができます。

class Demo
{
    Demo(int& val) : m_val(val)
     {
     }
private:
    const int& m_val;
};

constメンバ変数を変更できるのは、このときだけです。また、Michaelがコメント欄で指摘しているように、クラスメンバである参照を初期化する唯一の方法でもあります。

を初期化するために使用する以外では const この方法は、変数を初期化する方法として一般的に受け入れられているようで、あなたのコードを読む他のプログラマーにも明らかです。