引用与指针以及类型转换

More Effective C++ 学习笔记

Posted by Echo on April 21, 2020

C++ 是一个难学易用的语言!难学一方面在于其广博,因此我选择用笔记的形式精简出一些有用的条款。

引用和指针

指针/引用的区别

引用是对象的地址;指针是对象,其对象的内容是地址。

从其惯用写法也可以发现其差别:

int& ri = 1;    // ri 可以代表对象本身
int *pi = 1;    // pi 需要运算符 * 来获取对象

引用相当于别名,其主要功能是传递函数参数和返回值。

引用的规则:

  1. 必须初始化(指针可任何时候被初始化)
  2. 不能有 NULL 引用(指针可指向 NULL
  3. 一旦被初始化,不能改变引用关系(指针可随时修改所指对象)

下面的代码会产生不确定的结果,因此一定避免这种写法。

char *pc = 0;       // 设置指针为空值
char& rc = *pc;     // 让引用指向空值

有时候如果程序运行过程中会出现类似的情况,即变量可能指向空值,那么变量应该声明为指针

什么时候使用指针/引用更合适

如果存在以下两种情况:

  1. 存在不指向任何对象的可能
  2. 不同时刻指向不同对象

请使用指针

若总是指向一个对象并且一旦指向某个对象后不会改变指向,那么使用引用更为合理。

其次,重载操作符时,也应该使用引用

类型转换

四个操作符:

  1. static_cast<type>(expression),在功能上与 C 风格的类型转换一样强大
  2. const_cast<type>(expression),转换掉对象的 const 属性
  3. dynamic_cast<type>(expression),安全地沿着类的关系向下进行类型转换
  4. reinterpret_cast<type>(expression),可用于函数指针的类型转换

一般不建议代码里出现类型转换的语句,而且可以看到,C++ 类型转换的写法很不美观且键入麻烦。