引用
- 引用即别名,并非对象,它只是一个已经存在的对象所起的另外一个名字。
- 引用赋值,实际上是把值赋给了引用绑定的对象,获取引用的值,实际上是获取了与引用绑定的对象的值。
- 引用本身不是一个对象,所以不能定义引用的引用。
- 引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起。
指针
- 指针定义时,无需赋初值。
- 因为引用不是对象,没有实际地址,所以不能定义指向引用的指针。
- 所有只针的类型都要和它所指向的对象严格匹配。
指针值
应属于下列四种状态之一:
1.指向一个对象。
2.指向仅邻对象所占空间的下一个位置。
3.空指针,意味着指针没有指向任何对象。
4.无效指针,也就是上述情况之外的其他值。
试图拷贝或以其他方式访问无效指针的值都将引发错误。
-
利用指针访问对象
-
如果指针指向了一个对象,则允许使用解引用符(操作符*)来访问该对象
-
解引用操作仅适用于那些确实指向了某个对象的有效指针。
-
&和有多重含义
&和紧随类型名出现,因此是声明的一部分
&出现在表达式中,是一个取地址符
*出现在表达式中,是一个解引用符 -
空指针(null pointer)不指向任何对象,在试图使用一个指针之前代码可以首先检查它是否为空
以下列出几个生成空指针的方法:
int *p1 = nullptr; //等价于int *p1 = 0;
int *p2 = 0; //直接将p2初始化为字面常量0
//需要首先#include cstdlib
int *p3 = NULL; //等价于int *p3 = 0;
-
nullptr可以转换成任意类型的指针
-
void*指针是一种特殊类型的指针类型,可用于存放任意对象的地址。
-
void指针能做的事儿比较有限:拿它和别的指针比较、作为函数的输入或输出,或者赋给另外一个void指针。不能直接操作void*指针所指的对象
-
指向指针的引用
int *p; //p是一个int型指针
int *&r = p; //r是一个对指针p的引用
- 要理解r的类型到底是什么,最简单的方法是从右向左阅读r的定义。
const限定符
- const对象一旦创建后其值就不能再改变,所以const对象必须初始化
const int i = get_size(); //正确:运行时初始化
const int j = 42; //正确:编译时初始化
const int k; //错误:k是一个未经初始化的常量
//正确:
int n;
cin >> n;
const int k = n;
cout << k;
- 默认状况下,const对象仅在文件内有效
只在一个文件中定义const,而在其他多个文件中声明并使用它。
解决的办法是,对于const变量不管是声明还是定义都添加extern关键字,这样只需定义一次就可以了:
//file_1.cc定义并初始化一个常量,该常量能被其他文件访问
extern const int bufSize = fcn();
//file_1.h头文件
extern const int bufSize;//与file_1.cc中定义的bufSize是同一个
- const的引用
可以把引用绑定到const对象上,就像绑定到其他对象上一样,我们称之为
对常量的引用
const