1、引用概念
引用是别名,必须在声明的时候初始化。即:是指一个已定义变量的别名。(一个内存空间,有两个名字都可以操作)
引用:在函数调用时,是变量的别名,不可以单独存在,使用时必须要初始化;
指针:本身有自己的地址,可以单独存在。
2、引用基本举例
引用在交换时的例子:
void myswap01(int a, int b) { int c = 0; c = a; a = b; b = c; } void myswap02(int *a, int *b) { int c = 0; c = *a; *a = *b; *b = c; } // 引用,变量的别名,指代同一个存储空间 void myswap03(int &a, int &b) { int c = 0; c = a; a = b; b = c; } void main() { int x = 10, y = 20; myswap01(x, y); cout << "x= " << x << " y= " << y << endl; myswap02(&x, &y); cout << "x= " << x << " y= " << y << endl; myswap03(x, y); cout << "x= " << x <<" y= " << y << endl; system("pause"); }
3、引用本质思考
(1)引用就是别名,指向同一块内存空间。
(2)引用占用字节:int &a,,占用4个字节,就相当于一个指针所占的内存;引用有自己的存储空间,保存地址;
struct teacher { int age; // 4 char & a;//4,,相当于一个指针,占用4个字节 double &b;//4 }; void main() { cout << sizeof(teacher) << endl;//12 system("pause"); }
(3)本质:引用在C++中的内部实现:一个常量指针,所以引用所占内存大小和指针相同;
int& age ——> int* const age
相当于:编译器帮我们取了一个实参地址。
4、引用作为函数返回值
1、函数返回值为引用时,内存空间是必须要存在的(静态变量、全局变量),如果返回的是栈变量(局部变量),会出错,因为局部变量在函数返回时,地址就销毁了,比如下面的错误例子:
int& get2() { int a; a = 10; return a; }
如果返回的引用值,是静态变量或全局变量,则可以。
关键:看返回的内存空间是不是有效的内存空间。
2、引用作为左值,关键:看返回的内存空间是不是有效的内存空间。
// 返回的是一个值 int get1() { int a; a = 10; return a; } // 返回的是变量本身 int& get2() { static int a =10; a++; cout << "a:" << a << endl; return a; } void main() { get2() = 100; // 10 get2(); // 101 system("pause"); }
5、常量引用
int x = 10; // 常量引用,变量只有只读属性,不能通过 y 去改变 x 的值 // 必须要初始化 const int &y = x; // int &m = 11;// 11没有内存地址,所以错误, const int &z = 12; // 此时常量引用可以,编译器分配了内存空间给 Z,保存值:12