方法一:
将类的拷贝构造函数和赋值函数只声明,不定义,并定义为 private
class A{
private:
friend void copy_one();
A(const Uncopyable&) ;
A& operator=(const Uncopyable&) ;
};
void copy_one(){
A a
A b = a
}
缺点: 1. 友元 和 类内函数可以访问, 且会导致链接期错误,所以作为类的设计务必小心谨慎
更优的方法:
class Uncopyable{
protected:
// 因为在默认情况下只会帮忙合成一个默认构造函数,
当定义拷贝构造函数为delete 的时候,导致该类无法构造,
从而导致派生类不可构造
Uncopyable(){}
private:
Uncopyable(const Uncopyable&) ;
Uncopyable& operator=(const Uncopyable&) ;
};
class A: private Uncopyable{
public:
int a;
int b;
};
这样A的每一个对象将会成为独一无二的,且错误将会在静态编译期就暴露
int main(){
A a; // 基类的默认构造函数必不可少
A b = a;
}