一、引用
1.1、什么是引用?
C++新增了一种复合类型–引用变量。引用是已定义变量的别名,使用引用变量的主要的用途是作为函数的参数。通过将引用变量用作参数,通过形参就可以对原始的数据进行修改。这样除指针之外,引用也为函数处理class与struct提供了一种非常方便的途径。C++新增的这种特性也是对C语言的超越,C语言只能按值传递,如果直接传递对象会调用类的拷贝构造函数。
1.2、声明引用变量
C与C++使用&来获取变量的地址。C++给&赋予了另外一个含义,将其用来声明引用,例如:
class Student{
public:
int age;
Student() {
age = 100;
}
};
void Display(Student &r) {
cout << r.age << endl;
}
int main()
{
Student obj;
Display(obj);
return 0;
}
引用非常适合用于结构与类,C++中引入引用的主要目的是为了这些类型的,而不是基本的内置类型。
1.3、引用用作函数参数
将类对象传递给函数时,C++的通常的做法是使用引用。使用引用作为函数参数可以节省时间与内存,因为,如果直接传递对象,会调用类的拷贝构造函数,当形参的声明周期结束时,还会调用对应的析构函数
二、指针与引用比较
2.1、指针与引用概念的不同
指针:
它是存放地址的一个变量,在逻辑上它是独立的。指针是可以被改变的,包括其所包含的地址的改变和其指向的内存中保存的数据的改变。
引用:
是地址的别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须一开始就被初始化,而且引用不能改变,自始至终只能依附于一个变量。
2.2、传指针与传引用的区别
传指针:
传址的本质是传值,被调函数的形参作为被调函数的局部变量处理,形参保存实参传递进来的值。
传引用:
引用是变量的别名,传引用的原理还是传指针,传引用的时候实际上是拷贝了实参的地址,被调函数对形参进行修改时,主调函数传进来的变量也会发生变化。
三、指针与引用的相同点与不同点
3.1、相同点
两者都是地址的概念,指针变量拥有自己的内存,可以在指针变量中保存另外一块内存空间的地址;而引用是某块内存的别名。
3.2、不同点
- 指针是一个实体,引用是地址的别名。
- 如果定义一个引用,在定义时一定要进行初始化,不然编译时会出错,而且引用在初始化之后不能改变;但是指针变量中保存的地址可以发生改变。
- 引用不能为空,但是指针可以为空。
- 使用"sizeof 引用"得到的是引用对象的大小;而使用"sizeof 指针"得到的是指针变量的大小。
- 指针有指针常量与常量指针,引用只有常引用没有引用常量。
四、常指针与指针常量
指针(*)与常量(const)谁在前先读谁,例如:
int main(){
int a = 10;
int b = 20;
int const *p1 = &a; //const在前,定义为常指针
int * const p2 = &b; //*在前,定义为指针常量
return 0;
}
常指针:
指针指向的是常量,不能通过指针改变指向的变量的值,但是指针保存的地址可以改变。
指针常量:
指针是常量,不能改变指针保存的地址,但是可以改变指针指向的变量。