若不想使用编译器自动生成的函数,就该明确拒绝
//有些情况下,想要明确地拒绝对象之间的拷贝,可以采用两种方式: //方式1: 将拷贝构造函数和赋值操作声明为private,且不去实现 class A { private: A(const A&); A& operator=(const A&); }; int main() { A a1; //报错:没有默认的构造函数, 一旦存在自定义的构造函数,即使是copy构造函数,编译器也不再会生成默认构造函数了. A a2 = a1; //报错:拷贝构造函数不可访问.return 0; }
//方式2: 去继承一个拷贝构造函数和赋值运算符函数为private的基类 class Uncopyable { private: //protected: //当以下两个函数为非private时,下面Test中操作不会报错. Uncopyable(const Uncopyable&); Uncopyable& operator=(const Uncopyable&); protected: Uncopyable(); ~Uncopyable(); }; class B : private Uncopyable { }; void Test() { B b1; B b2; b2 = b1; //报错:无法引用赋值操作; 这个才是调用的赋值操作符 B b3 = b1; //报错:无法引用拷贝构造函数; 注意此时调用的拷贝构造函数 }
新战场:https://blog.csdn.net/Stephen___Qin