《More Effective C++》学习笔记之一引用与指针
引用没有空引用
首先要认识到,在任何情况下都不能使用指向空值的引用,引用应该被初始化,这也就意味着使用引用代码的效率比使用指针的要高,因为在使用引用之前不需要测试它的合法性。指针可以被重新赋值
这也就是说,指针可以被重新赋值以指向另一个不同的对象,但是引用则总是指向在初始化时被指向的对象,以后不能改变。- 重载某个操作符时应该使用引用
最普通的例子是操作符【】。这个操作符典型的用法时返回一个目标对象,其能被赋值
某博客总结的引用与指针:
它们都是地址的概念,其中指针指向一块内存,它的内容是所指内存的地址;而引用是某块内存的别名,具体来说,指针是一个变量的地址,而引用是一个变量的别名。
不同之处:
* 指针是一个实体,引用仅仅是个别名
* 引用必须被初始化,指针不必
* 引用只能在定义时被初始化一次,之后不可变;指针可以改变所指的对象
* 可以有const指针,但是没有const引用
* 不存在指向空值的引用,但是存在指向空值的指针,即引用不能为空,指针可以为空
* sizeof(引用)得到的是所指向的变量(对象)的大小,而sizeof(指针)得到的是指针本身(所指向的变量或对象的地址)的大小
* 指针可以有多级,引用只有一级
* 程序为指针变量分配内存区域,而引用不需要分配内存区域
* 使用指针传值涉及实参拷贝到形参,如果是引用 类型设计拷贝构造函数,要分配空间。
C++风格的四种类型转换
- static_cast
- const_cast
- dynamic_cast
- reinterpret_cast
static_cast
函数原型如下:
static_cast(expression)
具体用法如下:
* 用于类层次结构中基类和子类之间指针或引用的转换,向上转化(把子类的指针或引用转换成基类表示)是安全的;向下转型(把基类指针或引用转化成子类指针或引用)时,由于没有动态类型检查,所以是不安全的
* 用于基本数据之间的转换
* 把void指针转换成目标类型的指针
*# dynamic_cast
具体运算中:type_id必须是类的指针,类的引用后者void*;如果type_id是类指针类型,那么expression也必须是一个指针,如果是引用则其expressio也必须是引用