スコット・マイヤーズは彼の著書「Effective C ++」で、次のように述べています。
コンパイラによって自動的に提供される機能を禁止するには、対応するメンバー関数をprivateとして宣言し、実装を指定しません。その後、誰かが誤って呼び出した場合、リンク時にエラーが発生します。
スコットが説明しようとしていたことを達成するためのサンプルプログラムを書こうとしました。メンバー関数が宣言されpublic
、実装が与えられていない場合でも、同じことを達成できました。私の場合、別のオブジェクトからオブジェクトを初期化しようとしたときにもリンクエラーが発生しました。だから私はスコットが宣言されるメンバー関数の必要性を強調している理由を理解していませんprivate
か?
私のサンプルプログラムは以下のとおりです。
#include <iostream>
using namespace std;
class Unique
{
private:
int num;
public:
Unique(int x)
{
num = x;
}
Unique(const Unique &obj);
Unique& operator =(const Unique &obj);
void disp(void)
{
cout << "num = " << num << "\n";
}
};
int main()
{
Unique ob1(3);
Unique ob2(ob1);
ob1.disp();
ob2.disp();
return 0;
}
次のリンクエラーが発生します:
/tmp/ccXfqSqE.o(.text+0x135):関数
main': : undefined reference to
Unique :: Unique(Unique const&)'collect2:ldが1つの終了ステータスを返しました