指针和引用

什么是引用?

引用和指针的区别与联系

指针和引用的异同点

指针 引用
指针本身是对象 引用本身不是对象,只是对象的别名
允许对指针本身进行赋值和拷贝,在指针的生命期内可以指向不同的对象(只要指针不是常量指针) 引用定义时就和一个对象绑定,且始终和这个对象绑定,无法令引用重新绑定到另一个对象
指针无须在定义时赋初值,在块作用域内的指针如果没有被初始化,将拥有一个不确定的值. 引用必须初始化.
可以定义指向指针的指针 无法定义引用的引用

引用的常见用途

引用通常不用于声明变量,而用于参数类型和返回类型的描述.

1
2
3
4
5
6
7
8
9
10
void func1(Cls* pobj){ pobj->xxx();}
void func2(Cls obj){obj.xxx();}
void func3(Cls& obj){obj.xxx();}

Cls obj;
func1(&obj); // 接口不同

// 调用端口相同
func2(obj);
func3(obj);

以下两个函数被视为”same signature”(所以二者不能同时存在):

1
2
double imag(const double& im){...}
double imag(const double im){...} // Ambiguity

Q:const是不是函数签名的一部分?
A:是的,两个函数,一个函数有const,另一个没有,则可以看做函数重载.