3.5.6 禁止通过传值方式传递和返回类对象
类的设计者有时希望能通过某种方式来阻止客户进行对象间的拷贝操作,包括以下两种情况:
通过传值方式将对象传递给一个函数。
通过传值方式返回一个对象。
例如,如果用C++(www.cppentry.com)设计了一个window类,由于window对象很大,我们就会需要禁止window对象间拷贝操作。本小节探讨禁止对象间拷贝操作的一些编程(www.cppentry.com)技巧,这些技巧特别适用于上述两种对象拷贝情形。
如果拷贝构造函数是私有的,顶层函数和其他类的成员函数就不能通过传值来传递和返回该类的对象,因为这两个操作都需要调用拷贝构造函数。
例3-28
本例将类C拷贝构造函数的声明放在private区,这样main函数中对f的调用将导致一个严重错误,因为我们试图将c1以传值方式传递给函数f。要改正这个错误,我们就需修改f,将其参数类型改为类C的引用:
本例中main函数对g的调用同样会导致一个严重错误,因为函数g以传值方式返回一个C对象,就需要类C拥有一个公有的拷贝构造函数,但类C的拷贝构造函数是私有的。要避免这个错误,我们必须让g返回类C的引用: