3

C++ コードの 2 つのバージョンがあります。1つは問題を与え、もう1つは与えません:

/*
 * This compiles fine
 */
class base {
    private:
         const char c;
    };

int main() {
    base b(); // compiles fine
}

/* * これによりコンパイル エラーが発生します */

class base {
    private:
         const char c;
    };

int main() {
    base b; // error: structure 'b' with uninitialized const members

}

違いは「base b()」と「base b」であることに注意してください。どちらもデフォルトのコンストラクターを呼び出し、クラスには const フィールドがあるため、プログラムはコンパイルに失敗すると思いました。これを説明するのを手伝ってください。

4

2 に答える 2

4

これは、最初のバージョンが type のオブジェクトを作成するのではbaseなく、引数をとらず、 type のオブジェクトを返す呼び出される関数を宣言するためです。bbase

base b; // Declares an object b of type base
base b(); // Declares a FUNCTION called b that takes no argument an returns a base

実際、これが実際に当てはまるかどうかを確認するために、次のことを試すことができます。

int main() {
    base b(); // DECLARES function b()
    b(); // INVOKES function b()
}

base b() // DEFINITION of function b()
{
    base c;
    // ...
    return c;
}

これで関数main()はもう問題になりませんがbase c;、関数の内部で問題が発生しb()ます。base b;元の例とまったく同じです。なんで?

一般に、型がconst-qualified であるデータ メンバーは、オブジェクトを構築するとすぐに初期化する必要があるためです (参照型のデータ メンバーと同様)。一般的にこれを保証する方法は、コンストラクターの初期化リストでこれらのデータ メンバーを初期化することです。

たとえば、これは次のようにコンパイルされます。

class base {
public:
    base() : c('x') { }
private:
    const char c;
};

int main() {
    base b;
}
于 2013-05-23T15:53:48.513 に答える