11.3.4 替代拷贝构造函数的方法

现在,我们可能头已发晕了。我们可能想,怎样才能不必了解拷贝构造函数就能写一个具有一定功能的类。但是别忘了:仅当准备用按值传递的方式传递类对象时,才需要拷贝构造函数。如果不那么做时,就不需要拷贝构造函数。

11.3.4.1 防止按值传递

我们也许会说:“如果我自己不写拷贝构造函数,编译器将为我创建。所以,我怎么能保证一个对象将永远不会被通过按值传递方式传递呢?”

有一个简单的技术防止通过按值传递方式传递:声明一个私有拷贝构造函数。甚至不必去定义它,除非成员函数或友元函数需要执行按值传递方式的传递。如果用户试图用按值传递方式传递或返回对象,编译器将会发出一个出错信息。这是因为拷贝构造函数是私有的。因为已显式地声明我们接管了这项工作,所以编译器不再创建默认的拷贝构造函数。例如:

11.3.4 替代拷贝构造函数的方法 - 图1

注意使用的很普遍的形式

11.3.4 替代拷贝构造函数的方法 - 图2

这里使用了const。

11.3.4.2 改变外部对象的函数

引用语法比指针语法好用,但对于读者来说,它却使意思变得模糊。例如,在iostreams库函数中,一个重载版函数get()是用一个char&作为参数,这个函数的作用是通过插入get()的结果而改变它的参数。然而,当阅读使用这个函数的代码时,我们不会立即明白外面的对象正被改变:

11.3.4 替代拷贝构造函数的方法 - 图3

相反,此函数调用看起来更像是按值传递方式传递,暗示着外部对象没有被改变。

正因为如此,当传递一个可被修改的参数地址时,从代码维护的观点看,使用指针可能更安全些。如果总是应用const引用传递地址,除非打算通过地址修改外部对象(这个地址通过非const指针传递),这样读者更容易读懂我们的代码。