C++入门--引用-创新互联

  引用是什么呢?我们来看个例子

创新互联公司专注于网站建设|成都网站维护公司|优化|托管以及网络推广,积累了大量的网站设计与制作经验,为许多企业提供了网站定制设计服务,案例作品覆盖广告推广等行业。能根据企业所处的行业与销售的产品,结合品牌形象的塑造,量身开发品质网站。
#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元起,快前往官网查看详情吧


网页题目:C++入门--引用-创新互联
本文链接:http://scyanting.com/article/ejogd.html