1、通常我们定义一个类时,不显示的定义类的拷贝构造函数和拷贝赋值运算符时,编译器会生成两个默认的函数:
class Foo{
Foo(const Foo&);//1
Foo& operator=(const Foo&)//2
};
1是拷贝构造函数,2是拷贝赋值运算符。Foo类可以做如下操作:
Foo f1;
Foo f2(f1);
Foo f2 = f1;
2、禁止类的拷贝
把类的拷贝构造函数和拷贝赋值运算符声明为private即可禁止类的拷贝。
class Foo{
private:
Foo(const Foo&);
Foo& operator= (const Foo&);
}
此时若进行拷贝操作则会报错: 无法引用 函数 "Foo::Foo(const Foo&)" (已隐式声明) -- 它是已删除的函数
3、便捷的使用方式
为了方便禁止类的拷贝,可以定义一个nocopy类,需要禁止拷贝的类继承nocopy类即可。
class NoCopy {
protected:
NoCopy() {}
private:
NoCopy(const NoCopy&);
NoCopy& operator= (const NoCopy&);
};