第11章 引用和拷贝构造函数
引用就像是能自动地被编译器间接引用的常量型指针。
虽然引用Pascal语言中也有,但C++中引用的思想来自于Algol语言。在C++中,引用是支持运算符重载语法的基础(见第12章),也为函数参数的传入和传出控制提供了便利。
本章首先简单地介绍一下C和C++的指针的差异,然后介绍引用。但本章的大部分内容将研究对于C++新手来说比较含混的问题:拷贝构造函数(copy-constructor)。它是一种特殊的构造函数,需要用引用来实现从现有的相同类型的对象中产生新的对象。编译器使用拷贝构造函数通过按值传递(by value)的方式在函数中传递和返回对象。
本章最后将阐述有点难以理解的C++的成员指针(pointer-to-member)这个概念。
11.1 C++中的指针
C和C++指针的最重要的区别在于C++是一种类型要求更强的语言。就void而言,这一点表现得更加突出。C不允许随便地把一个类型的指针赋值给另一个类型,但允许通过void来实现。例如:
由于C的这种功能允许把任何一种类型看做别的类型处理,这就在类型系统中留下了一个大的漏洞。C++不允许这样做,其编译器将会给出一个出错信息。如果真想把某种类型当做别的类型处理,则必须显式地使用类型转换,通知编译器和读者(第3章已经介绍了C++的经过改进“显式”类型转换语法)。