5

組み込み型のように動作させたいカスタムクラスがあります。

ただし、初期値を指定しなくても、そのクラスのconst変数を初期化できることに気付きました。私のクラスには現在、空のデフォルトコンストラクタがあります。

これがintと私のクラスfooの比較です:

int a;              // Valid
int a = 1;          // Valid
const int a = 1;    // Valid
const int a;        // Error

foo a;              // Valid
foo a = 1;          // Valid
const foo a = 1;    // Valid
const foo a;        // Should cause an error, but it compiles

あなたが見ることができるように私は防ぐ必要があります

const foo a;

コンパイルから。

C ++の達人からのアイデアはありますか?

4

2 に答える 2

6

デフォルトのコンストラクターがある場合にのみコンパイルされ、それがあるためコンパイルされます。つまり、初期化されます。その行をコンパイルしたくない場合は、デフォルトのコンストラクターを無効にするだけです (foo a;望ましくない副作用としてエラーも発生します)。あなたが何をしたいかの定義がなければfoo、これは私が得ることができる限りです.

あなたが望むものを達成する方法はないと思います(つまり、constバージョンをコンパイルに失敗させ、コンストラクターの提供を必要とする他のユースケースを許可しながら、非const変数をデフォルトで初期化できるようにします)

于 2011-11-18T12:22:25.830 に答える
3

new T;C++ の規則では、デフォルトの初期化 (例: ) と値の初期化 (例: new T();) は、クラス型のオブジェクトでは同じですが、基本型のオブジェクトでは同じではないと単純に述べています。

この区別を「オーバーライド」するためにできることは何もありません。文法の基本部分です。クラスが値初期化可能である場合、デフォルト初期化可能でもあります。

ユーザー定義のコンストラクターを持たないクラスには、ある種の例外があります。その場合、メンバーの初期化は再帰的に行われます (したがって、オブジェクトをデフォルトで初期化すると、すべてのメンバーをデフォルトで初期化しようとします)、これは失敗します。クラスメンバーのいずれかがそれ自体が基本的なものであるか、またはこの性質のものである場合。

たとえば、次の 2 つのクラスについて考えてみます。

struct Foo { int a; int b; };
struct Goo { int a; int b; Goo(){} };

//const Foo x; // error
const Goo y;   // OK

Foo基本メンバーを初期化しないため、暗黙のコンストラクターは拒否されます。ただし、y喜んでデフォルトで初期化されy.ay.b現在は「意図的に空白のまま」になっています。

ただし、クラスにユーザー定義のコンストラクターがない場合を除き、この情報は役に立ちません。初期化タイプをメンバーに「転送」することはできません( などFoo() : INIT_SAME_AS_SELF(a), b() { })。

于 2011-11-18T12:43:33.500 に答える