4

単一の.hファイルに次のクラスがあります。

class MyClass
{
protected:
   MyClass();
   ~MyClass();

private:
   MyClass(const MyClass&);
   MyClass& operator=(const MyClass&);
};

inline MyClass::MyClass()
{
}

inline MyClass::~MyClass()
{
}

私が混乱しているように見えるのは、MyClass(const MyClass&)コピーコンストラクターとMyClass&operator =(const MyClass&)代入演算子のオーバーロードが実装されているコードがないことです。クラスには定義がありますが、他には何もありません。

私が分析しているコードでこれを見たことがあり、完全にコンパイルされます。私はC++を初めて使用し、これまでに見たすべての例で、以下のクラスと実装の両方、または別の.cppファイルで定義を見つけました。

では、なぜこのコードがコンパイルされるのか、そしてなぜ関数の宣言だけを含め、その実装は含めないのか、誰でも説明できますか?

ありがとうございました!!

4

3 に答える 3

5

コピーの作成と割り当ては、作者によって明示的に禁止されています。

外部で使用した場合はエラーになります(であるためprivate)。内部またはによって参照されている場合friend、定義が存在しないため、リンクエラーが発生します。

C ++ 11では、これはより明確に次のように記述されます。

MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;

ここで、コンパイラはコンパイル時にこれに注意します-追加のドキュメントなしでリンカーエラーと明確な意図はありません:)

于 2013-03-07T23:30:15.930 に答える
0

関数が定義されているが使用されていない場合、コードはコンパイルされます。それらが定義されていて使用されていない場合、オプティマイザーはそれらを削除します。ただし、それらを使用すると、リンカーエラーが発生します。

関数を定義し、記入しないことは悪い習慣です。特に他の誰かがこのコードを使用する場合。

しかし、コメントの中で、クリスは良い点を述べています。デフォルトの機能を使用したくない場合に便利です。これはまた、それがプライベートセクションにある理由でもありcopyます=

于 2013-03-07T23:28:02.580 に答える
0

コンストラクターを明示的に定義する場合は、他のすべての暗黙的なコンストラクターを無効にします。したがって、これには影響があり、多くの状況で役立ちます。ただし、デストラクタ(仮想として宣言されていない)を定義して空のままにする理由はありません。

于 2013-03-07T23:28:48.337 に答える