知识点回顾
-
引用和指针:
引用:为对象重新起了一个名字,一经定义必须初始化(一旦初始化后其无法再绑定到其他对象上),引用并非对象,无实际地址,无法用指针指向它;
指针:指针本身就是一个对象,可以赋值和拷贝,无需在定义的时候赋初始值,它的指向可以改变;
(注:如果函数返回值是一个存在的对象,则返回值可以用“引用”较为高效,其可以少调用一次拷贝构造函数) -
引用的范围:
a.引用变量:
int a = 10;
int &b = a;
b.引用指针:
int* p = NULL;
int* &m = p;(用 m 引用指针 p ,只是给 p 重新起了一个名字)
c.引用数组:
int arr[10];
int (&trr)[10] = arr;
d.引用常变量:
const int d = 10.12;
const int &a = d;(常量 d 只能用常量来引用)
int d = 10.12;
const int &a = d;(常量 a 可以引用变量 d )
3.指针和引用的区别和联系:
a.引用只能在定义的时候初始化一次,之后不能改变指向其他变量(必须从一而终),而指针变量可以指向别的变量,可以更改对象;
b.引用必须指向有效的变量,(比如不能引用一个空对象),指针可以为空;
c.sizeof指针对象和引用对象的意义不同,sizeof引用所得到的值是指向变量对象的大小,而sizeof指针获得的值是对象地址的大小;
d.指针和引用自增自减意义不同;
e.相对而言,引用比指针更安全;
思考:引用可以引用指针吗?当然可以,但是还要看引用的是什么?
1.引用可以引用指针所指向的有效对象(不能是空对象),那么我们就是给指针所指向的对象起了一个别名;
2.引用也可以引用我们的指针,(指针引用指针),相当于给我们的原指针起了一个别名,但是二者所指向的地址是同一块地址;
但是反向则不可以,不允许使用指向引用的指针。
面向对象的优点:安全性和独立性(封装),可重用性(继承)
4.const修饰符:
a.const修饰变量:
int const *p = const int *p(等价)
(含义:*p所指向的值不能改变)
int * const p
(含义:p的值不能改变)
const int * const p
(含义:*p和p的值都不能改变)
b.const修饰类成员:
const修饰的类成员变量一经定义必须初始化,且不能改变其值,使其具有常量属性;const修饰的类成员函数不能修改类成员变量,只能使用,使用时const应该放在函数尾部;
eg:void Display()const{}
1>const 修饰的对象可以调用const修饰的类成员;
2>const 修饰的类成员可以调用const修饰的类成员;
3>非const 修饰的对象可以调用const修饰的成员;
4>非const 修饰的类成员可以调用const修饰的类成员;
(如果要在多个文件下共享const修饰的对象,必须在其定义之前+“extern”关键字)
但是!!如果在const修饰的类成员函数中修改成员变量时,是不允许的,但是某些情况下我们需要内部修改怎么办,我们可以使用 “mutable”(可变的) ,他可以帮助释放掉非静态成员变量的const约束。
思考:引用是否也占用空间?
引用的底层其实就是const* 类型,它也占用一定空间
对引用使用&获取的地址和对象地址相同,是因为这不是引用的真实地址,
因为引用的意义就是一个对象的别名,对她的所有操作都是对这个对象而言的,所以&获取的地址也是对象的地址;
这里有篇文章讲的比较详细:链接
备注:指针的地址不是对象的地址,是存放对象地址的地址(指针也是一个对象,指向(存放)一个对象的地址)