引用(C++)
2023-12-20 21:49:48
1.6 引用
C++出现了新的概念:引用。引用是某个变量的别名。
语法格式如下:
? 类型 &引用名 = 变量名;
#include <iostream>
using namespace std;
int main (void) {
int num = 8;
int &nr = num;
cout << "num = " << num << endl;//num = 8
cout << "nr = " << nr << endl;//nr = 8
cout << "num的地址: " << &num << endl; //num的地址: 0xbfcdf738
cout << "nr的地址: " << &nr << endl;//nr的地址: 0xbfcdf738
return 0;
}
例子当中可以看出来 num 和 nr 其实是同一块内存。
用途:
? 1)简化编程,用指针的场景可以用引用替换(尽量减少指针的使用)
#include <iostream>
using namespace std;
void swap(int *p1, int *p2) { //交换函数
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
struct stu { //结构体
char name[20];
int age;
int score;
};
namespace func1{ //名字空间
void func(struct stu s1) {
cout << "fun1 : " << &s1 << endl;
}
}
namespace func2 { //名字空间
void func(struct stu &s1) {
cout << "fun2 : " << &s1 << endl;
}
}
int main (void) {
int x = 100;
int y = 200;
swap(&x, &y);
cout << "x : " << x << "\t" << "y : " << y << endl;
stu s1;
cout << "struct stu : " << &s1 << endl;
func1::func(s1);//这样调用会导致创建两个结构体的内存
func2::func(s1);//调用这个用到引用的函数,系统开销会小一些,不会有新的结构体形参变量出现。
return 0;
}
在使用引用时需要注意一下几个问题:
-
&的位置是灵活的,一下几种定义完全相同
int& nr = num; int &nr = num; int & nr = num;
-
在变量声明时出现&才是引用运算符(包括函数参数声明和函数返回类型的声明)
int &nr = num; int &f(int &nr, int &n);
-
引用必须定义时初始化
float f; float &r1 = f; float &r2; r2 = f; //错误
-
const引用(常引用)。在定义引用时一般为左值(变量)。
左值,是指变量对应的那块内存区域,是可以放在赋值号左边的值;
右值,是指变量对应的内存区域中存储的数据值,是可以 放在赋值号右边的值;
常量、表达式都是右值,例如:
int i = 1; i = i+10; i+10 = i; //错误 i = 10; 10 = i; //错误
可以使用const进行限制,使他成为不允许修改的常量引用。
int x = 10; // int &ri = 100; //error const int &r1 = 100; //ok 常引用 万能引用 const int &r2 = x; //ok // r1++; //error int a = 100; char &c = a; //错误,将c转换char类型,转换结果保存到临时变量中 实际引用临时变量,而临时变量是右值
-
引用的本质
引用的本质就是指针常量。
#include <iostream> using namespace std; void swap(int &x, int &y) { //交换函数 int temp = x; //temp = *y; x = y; //*x = *y; y = temp; //*y = temp; } int main (void) { int x = 10, y = 20; swap(x, y); return 0; }
文章来源:https://blog.csdn.net/qq_36091214/article/details/135117388
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!