使用私有拷贝construcor和赋值运算符boost::noncopyable或C++ 11 delete关键字很容易创建不可复制的类:
class MyClass {
private:
int i;
public:
MyClass(const MyClass& src) = delete;
MyClass& operator=(const MyClass& rhs) = delete;
int getI() {
return i;
}
MyClass(int _i) : i(_i){}
};
int main() {
MyClass a(1), b(2);
a = b; // COMPILATION ERROR
}
Run Code Online (Sandbox Code Playgroud)
但是,这并不能防止obiect被深度复制为一个字节包:
int main() {
MyClass a(1), b(2);
std::memcpy(&a, &b, sizeof(MyClass));
std::cout << a.getI() << std::endl; // 2
}
Run Code Online (Sandbox Code Playgroud)
即使试图通过声明operator&私有来阻止它,仍然可以使用地址的成语来实现复制:
int main() {
MyClass a(1), b(2);
std::memcpy(std::addressof(a), std::addressof(b), sizeof(MyClass));
std::cout << a.getI() << std::endl; // 2
}
Run Code Online (Sandbox Code Playgroud)
有没有任何方法可以完全防止每个字节复制一个实例?