引用 :
引用不是新定义一个变量 , 而是给已存在的变量取一个别名 , 编译器不会为引用变量开辟空间 , 它和它引用的变量共用同一块内存空间 .
类型& 引用变量名(对象名)=引用实体
特性 :
1 . 引用在定义时必须初始化 ;
2 . 一个变量可以有多个引用 ;
3 . 引用一旦引用一个实体 , 再不能引用其他实体 .
#include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; //定义一个结构体 struct A{ int a; int b; int c; int d; int e; }; void test(){ int a = 10; //ra是一个引用 : 是a的别名 , 指向和a相同的实体 int& ra = a; A sa; sa.a = 1; sa.b = 1; sa.c = 1; sa.d = 1; sa.e = 1; //引用: 不分配空间, 改rsa相当于改sa; A& rsa = sa; //拷贝: 分配新的空间,不改变sa A copy = sa; copy.a = 100; cout << sa.a << endl; rsa.a = 5; cout << sa.a << endl; } int main(){ test(); system("pause"); return 0; }
引用也可以实现两个变量内容的交换 , 之前我们只能使用指针来进行 , 现在可以使用引用 , 引用比指针更好理解 , 也更简单 .
//两个变量内容交换(指针) void Swap(int* a, int* b){ int tmp = *a; *a = *b; *b = tmp; } //两个变量内容交换(引用) void Swap(int& a, int& b){ int tmp = a; a = b; b = tmp; }
引用做返回值时 , 返回值的生命周期需要大于函数的生命周期
常引用:
引用指向的实体不能修改
void test(){ //const 类型& const int a = 10; /*a是常量,不能被引用*/ int& ra = a;/* (错误代码)*/ //使用常引用引用常量 const int& ra = a; /*100是常量,不能被引用*/ int& ra2 = 100;/* (错误代码)*/ //使用常引用引用常量 const int& ra2 = 100; }
引用和指针的不同点 :
1 . 引用概念上定义一个变量的别名 , 指针存储一个变量的地址 ;
2 . 引用在定义时必须初始化 , 指针没有要求 ;
3 . 引用在初始化时引用一个实体后 , 就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体 ;
4 . 没有NULL引用 , 但有NULL指针 ;
5 . 有多级指针 , 但没有多级引用 ;
6 . 访问实体方式不同 : 指针需要显示解引用 , 引用编译器自己处理 ;
7 . 在sizeof中含义不同 : 引用结果为引用类型的大小 , 但指针始终是地址空间所占字节个数 ;
8 . 引用自加是给引用的实体增加1 , 指针自加是指针向后偏移一个类型大小 ;
9 . 引用比指针使用起来相对更安全
原文:https://www.cnblogs.com/enjoyC/p/14682877.html