C++中的引用与指针

引用

引用(reference)为对象起了另外一个名字,通过将声明符写成 &d 的形式来定义引用类型。

1.引用必须被初始化

定义引用时会把引用类型与它的初始值对象绑定在一起,而不是用值拷贝来初始化。初始化完成后,该绑定会一直存在,无法将引用重新绑定到另一个对象,所以引用必须初始化。

2.引用本身不是一个对象,所以无法定义引用的引用,也无法定义指向引用的指针

3.引用类型要和与之绑定的对象严格匹配

有两种例外情况,一个是常量引用,一个是存在继承关系的类。

常量引用可以用任意表达式初始化,特别的,允许一个常量引用绑定到非常量对象上,反之是不被允许的,也只有常量引用被允许绑定到字面值或表达式上。

int i = 42;

const int &r1 = i;
const int &r2 = 42;
const int &r3 = r1*2;

存在继承关系的类中,我们可以将基类的指针或引用绑定到派生类对象上。

指针

指针是“指向”另一种类型的复合类型。

1.与引用不同,指针本身就是一个对象,允许对指针进行赋值和拷贝,也可以在其生命周期内改变其所指对象

指针在这方面表现得更像一个普通对象,无须在定义时初始化。

2.同引用一样,指针的类型要和它所指对象的类型严格匹配

同引用一样,也有两种例外情况,一个是指向常量的指针,一个是存在继承关系的类。

指向常量的指针可以指向非常量对象,该非常量对象仍然可以被改变,只是不能通过该指针去改变。

存在继承关系的类中,我们可以将基类的指针或引用绑定到派生类对象上。

3.空指针(null pointer)

空指针不指向任何对象。有三种生成空指针的方法:

int *p = nullptr;  //c++11标准的的方法,推荐使用,nullptr是一种特殊类型的字面值。
int *p2 = 0;  
int *p3 = NULL; //NULL是一个预处理变量,在头文件cstdlib中定义,值为0。

ps.初始化所有指针,未定义的行为将引发莫名其妙的bug

4.void*指针

void* 是一种特殊的指针类型,可用于存放任意对象的地址,但并不能知道该指针所指对象是什么类型,也就不能直接操作void* 指针所指的对象。
以void* 的视角来看,它所指的就是一块内存地址,没办法访问该地址所存的对象

你可能也喜欢

0 0 vote
Article Rating
Subscribe
提醒
0 评论
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x
Scroll to Top