新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
引用是什么呢?我们来看个例子
创新互联公司专注于网站建设|成都网站维护公司|优化|托管以及网络推广,积累了大量的网站设计与制作经验,为许多企业提供了网站定制设计服务,案例作品覆盖广告推广等行业。能根据企业所处的行业与销售的产品,结合品牌形象的塑造,量身开发品质网站。#includeusing namespace std;
int main()
{
int a = 10;
//引用定义
int& b = a;
//取地址
int* p = &a;
return 0;
}
引用不是新定义一个变量,而是给已经存在的变量取别名,我们不难看出引用在语法层面上,没有开辟新空间,是对原本的空间又取了一个新名字,即,地址是一样的。既然都是那个空间,那么只要改变一个也就改变另一个了
int main()
{
int a = 10;
int& b = a;
a = 20;
b = 30;
return 0;
}
引用有哪些特性呢?
1.引用在定义时必须初始化
//int a = 10;
//int& b;
不初始化是编译不过的
2.一个变量可以有多个引用
int a = 10;
int& b = a;
int& c = a;
int& d = b;
3.引用一旦引用一个实体,再不能引用其它实体
int a = 10;
int& b = a;
int c = 20;
b = c; //把c赋值给b
return 0;
这点和指针不同的是:指针的指向可以改变,而引用初始化后就不能更改对象了
引用有什么用呢?
// 1.引用做参数
void swap(int* p1, int* p2) //传地址
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
void swap(int& r1, int& r2) //传引用
{
int tmp = r1;
r1 = r2;
r2 = tmp;
}
//void swap(int r1, int r2) //传值
//{
// int tmp = r1;
// r1 = r2;
// r2 = tmp;
//}
int main()
{
int x = 0, y = 1;
swap(x, y);
swap(&x, &y);
return 0;
}
我们需要注意的是,上面三个函数构成函数重载(满足参数类型不同、参数个数不同、参数顺序不同),但是当传值与传引用同时存在的时候,调用会出现问题。
看下面代码:
//传值返回
int Add(int a, int b)
{
int c = a + b;
return c;
}
int main()
{
int ret = Add(1, 2);
cout<< ret<< endl;
return 0;
}
所有传值返回都要生成一个拷贝,当c返回的时候,产生一个临时变量,ret接收这个临时变量。如果c比较小(4或8个字节)一般是寄存器充当临时变量。如果c比较大,临时变量放在调用Add函数的栈帧中。
传引用返回
//int& Add(int a, int b)
//{
// int c = a + b;
// return c;
//}
//
//int main()
//{
// int ret = Add(1, 2);
// cout<< ret<< endl;
//
// return 0;
//}
引用返回的意思是不产生c的拷贝返回,直接返回c的引用。
上面代码的问题是:存在非法访问,Add(1, 2)的返回值是c的引用,而函数执行完栈帧已经销毁,又访问c位置的空间。
看下面代码:
传引用返回
//int& Add(int a, int b)
//{
// int c = a + b;
// return c;
//}
//
//int main()
//{
// int& ret = Add(1, 2);
// cout<< ret<< endl;
//
// cout<< ret<< endl;
//
// return 0;
//}
这代码中的ret就是c的引用,因此,两次打印的值是不同的。
那么,什么时候传引用返回呢?
当函数返回时,出了函数作用域,如果返回对象没有还给系统,则可以使用引用返回。
//常引用
void f(const int& x)
{
cout<< x<< endl;
}
int main()
{
权限放大,不可以
//const int a = 10;
//int& b = a;
//权限不变,可以
const int a = 10;
const int& b = a;
//权限变小,可以
int c = 10;
const int& d = c;
f(a);
f(c);
f(d);
return 0;
}
总结:引用的作用主要体现在传参和传返回值 1、引用传参和传返回值,有些场景下面,可以提高性能。(大对象+深拷贝对象) 2、引用传参和传返回值,输出型参数和输出型返回值。通俗点说,有些场景下面,形参的改变可以改变实参。 3.有些场景下面,引用返回,可以改变返回对象。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧