このブログ投稿とこのシリーズは、「Effective C ++」を見ることについての私の考えであり、毎日C ++を改善するためのちょっとしたコツを学びます。
項目06:コンパイラによって自動的に生成された関数を使用したくない場合は、明示的に拒否する必要があります。????????????????????????? ?????????????????????????????????????????????????? ?????????????????????????????????????????????????? ?????????????????????????????????????????????????? ?????????????????????????????????????????????????? ?????????????????????????????????????????????????? ?????????????????????????????????????????????????? ?????????????????????????????????????????????????? ?????????????????????????????????????????????????? ?????????????????????????????????????????????????? ?????????????????????????????????????????????????? ?????????????????????????????????????????????????? ?????????????????????????????????????????????????? ?????????????????????????????????????????????????? ?????????????????????????????????????????????????? ???????????????
以前のブログ投稿では、宣言しなかった場合、コンパイラーがデフォルトのコンストラクター、デストラクタ、代入演算、およびコピーコンストラクターを宣言すると述べていました。
場合によっては、作成するオブジェクトを一意にし、他のオブジェクトに割り当てたりコピーしたりしたくない場合があります。これを行うことができます。
class MySelt
{
public:
MySelt() {
//..
}
~MySelt() {
//..
}
private: //将拷贝其构造函数和赋值函数声明为private。
//...
MySelt(const MySelt&) {
//...
}
MySelt& operator= (const MySelt&)
{
//...
}
};
ただし、これはベストプラクティスではありません。これは、そのメンバー関数とフレンド関数(フレンド)が引き続きコピー関数と割り当て関数にアクセスできるためです。
ベストプラクティスは次のとおりです。
class MySeltBase {
protected:
MySeltBase(){
//...
}
~MySeltBase() {
//...
}
private:
MySeltBase(const MySeltBase&) {
//...
}
MySeltBase& operator= (const MySeltBase&) {
//..
}
};
class MySeltDerive:private MySeltBase {
//...
};
int main()
{
MySeltDerive msd;
//MySeltDerive msd1(msd); //报错,无法拷贝
//MySeltDerive msd2 = msd; //报错,无法赋值
}
MySeltDeriveクラスは、コピー構築および代入操作関数を宣言しなくなりました。
覚えておいてください
関数を自動的に提供するコンパイラの関数に対処するために、対応するメンバー関数をプライベートとして宣言し、実装しないことができます。上記と同じように使用します。