C++(day03)
(1)引用
(2)const引用
(3)引用传递
(4)引用作为函数返回值
(5)引用与指针区别
1、引用
¥引用是给一个变量起别名(引用不是变量,引用仅仅只是变量的别名,引用没有自己独立的空间,引用要与它所引用的变量共享空间,对引用所做的改变实际上 是对它所引用的变量的改变)
¥定义引用的一般格式:
类型 &引用名 = 变量名;
例如:int a = 1;
int &b = a; //b是a的别名,因此a和b是同一个单元
¥注意:定义引用时一定要初始化,指明该引用变量是谁的别名。
¥在实际应用中,引用一般用作参数传递与返回值。
#include <iostream> #include <cstdio> using namespace std; int main(void) { int val = 100; //int& refval; Error,引用必须初始化 int& refval = val; refval = 200; //将200赋值给refval,实际上改变的是val这个变量 cout << "val = " << val << endl; //输出:val = 200 int val2 = 500; refval = val2; //不代表将refval引用至val2这个变量。仅仅只是代表将val2赋值给refval,引用一经初始化,不能重新指向其它变量 cout << "val = " << val << endl; //输出:val = 500 return 0; }
2、const引用
¥const引用是指向const对象的引用。
#include <iostream> #include <cstdio> using namespace std; int main(void) { const int val = 1024; const int& refval = val; //int& ref2 = val; //Error,nonconst reference to const object //refval = 200; //Error,refval是一个常量 int val2 = 1024; const int& ref3 = val2; //const reference to nonconst object double val3 = 3.14; const int& ref4 = val3; //int temp = val3; //const int& ref4 = temp; cout << "ref4 = " << ref4 << endl; cout << "val3 = " << val3 << endl; //int& ref5 = val3; Error return 0; }
3、引用做为参数传递
¥引用传递方式是在函数定义时在形参前面加上引用运算符“&”
例如:swap(int& a,int &b);
¥按值传递方式容易理解,但形参值的改变不能对实参产生影响。
¥地址传递方式通过形参的改变使相应的实参改变,但程序容易产生错误且难以阅读。
¥引用作为参数对形参的任何操作都能改变相应的实参的数据,又使函数调用显得方便、自然。
#include <iostream> #include <cstdio> using namespace std; void swap(int& x, int& y) { int temp = x; x = y; y = temp; } int main(void) { int a = 5; int b = 6; swap(a, b); // 在函数调用时,引用被初始化,x = a, y = b; cout << "a = " << a << " b = " << b << endl; return 0; }
4、引用作为函数返回值
¥引用的另一个作用是用于返回引用的函数
¥函数返回引用的一个主要目的是可以将函数放在赋值运算符的左边。
#include <iostream> #include <cstdio> using namespace std; int a[] = {0,1,2,3,4}; int& index(int i) { return a[i]; } int main(void) { index(3) = 100; //引用作为函数返回值,使得函数可以放在赋值运算符左边,引用在函数返回的时候初始化 cout << "a[3] = " << a[3] << endl; //输出:a[3] = 100 return 0; }
¥注意:不能返回对局部变量的引用。
#include <iostream> #include <cstdio> using namespace std; /* 不能返回局部变量的引用。 */ int& add(int a, int b) { int sum; sum = a + b; return sum; } int main(void) { int n = add(3,4); //warning C4172: 返回局部变量或临时变量的地址: sum int& n2 = add(5,6);//n2的 cout << "n2 = " << n2 << endl;//输出:n2 = 11 这里输出结果正确是假象,是因为局部变量sum释放的内存空间还为被占用,sun的值还存在 cout << "n = " << n << endl; //输出: n = 7 cout << "n2 = " << n2 << endl; //输出:n2 = 2076481928 //n2是引用,没有自己独立的空间,n2的值依赖于它所引用的变量,如果n2所引用的变量生命周期结束了,也就是说n2是一个无效的引用,那么n2的值将是不确定的。 return 0; }
5、引用与指针区别
¥引用访问一个变量是直接访问,而指针是间接访问,
¥引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间。
¥引用一经初始化不能再引用其它变量,而指针可以。
¥尽可能使用引用,不得已时使用指针。
¥几种传递的比较:
值传递:实参要初始化形参数要分配空间,将实参内容拷贝到形参
引用传递:实参初始化形参时不分配空间。
指针传递:本质是值传递(地址),实参初始化形参的时候,也是分配空间的,分配的是4字节的空间,(32位系统),如果我们要修改指针的地址,单纯用指针传递也是不行的,用** *&
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人