很多时候,用户希望根本不复制C++类的实例。那么,问题是我们如何实现这一目标?
有三种方法可以实现此目的:
- 在类中将Copy构造函数和Copy赋值运算符保留为私有。
下面是C++实现,以说明如何实现。
#include
using namespace std; class Base { int x; public: Base() { } Base(int y): x(y) { } private: // Copy constructor Base(const Base& obj) : x(obj.x) { } // copy assignment operator Base& operator=(const Base& tmp_obj) { x = tmp_obj.x; return *this; } }; int main() { Base b1(10); Base b2(b1); // calls copy constructor b2 = b1; // calls copy assignment operator return 0; } 注意:此代码无法编译,因为我们无法复制此类的对象,因此将显示此错误。
prog.cpp: In function 'int main()': prog.cpp:18:2: error: 'Base::Base(const Base&)' is private Base(const Base &obj) : x(obj.x) //Copy constructor ^ prog.cpp:33:12: error: within this context Base b2(b1); // Calls copy constructor ^ prog.cpp:22:8: error: 'Base& Base::operator=(const Base&)' is private Base& operator = (const Base& tmp_obj) // copy assignment operator ^ prog.cpp:35:5: error: within this context b2 = b1; // calls copy assignment operator ^
- 继承具有私有副本构造函数和私有副本分配运算符的Dummy类。
下面是C++实现,以说明如何实现。
#include
using namespace std; class Dummy { public: Dummy() { } private: Dummy(const Dummy& temp_obj) { } Dummy& operator=(const Dummy& temp_obj) { } }; class Base : public Dummy { int x; public: Base() { } Base(int y) : x(y) { } }; int main() { Base b1(10); Base b2(b1); // Calls copy constructor b2 = b1; // Calls copy assignment operator return 0; } prog.cpp: In function 'int main()': prog.cpp:12:5: error: 'Dummy::Dummy(const Dummy&)' is private Dummy(const Dummy &temp_obj) ^ prog.cpp:22:7: error: within this context class Base: public Dummy ^ prog.cpp:16:12: error: 'Dummy& Dummy::operator=(const Dummy&)' is private Dummy& operator = (const Dummy &temp_obj) ^ prog.cpp:22:7: error: within this context class Base: public Dummy
注意:此代码无法编译,因为我们无法复制此类的对象,因此将显示此错误。
- 使用Deleted复制构造函数和复制赋值运算符:以上两种方法非常复杂,C++ 11提出了一个更简单的解决方案,即删除复制构造函数和赋值运算符。
下面是C++的实现,以说明:
// CPP program to demonstrate use Delete copy // constructor and delete assignment operator #include
using namespace std; class Base { int x; public: Base() { } Base(int y) : x(y) { } Base(const Base& temp_obj) = delete; Base& operator=(const Base& temp_obj) = delete; }; int main() { Base b1(10); Base b2(b1); // Calls copy constructor b2 = b1; // Calls copy assignment operator return 0; } prog.cpp: In function 'int main()': prog.cpp:24:15: error: use of deleted function 'Base::Base(const Base&)' Base b2(b1); // Calls copy constructor ^ prog.cpp:16:5: note: declared here Base(const Base &temp_obj) = delete; ^ prog.cpp:26:8: error: use of deleted function 'Base& Base::operator=(const Base&)' b2 = b1; // Calls copy assignment operator ^ prog.cpp:17:11: note: declared here Base& operator = (const Base &temp_obj) = delete; ^
注意:此代码不起作用,因为我们无法复制此类的对象,因此将显示此错误。
参考:
https://ariya.io/2015/01/c-class-and-preventing-object-copy
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。