首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C++之引用

C++之引用

作者头像
zy010101
发布2020-04-08 16:36:22
发布2020-04-08 16:36:22
6020
举报
文章被收录于专栏:程序员程序员

引用是C++引进的新的特性。在这里总结一下引用的使用问题。在这里所谓的引用是指左值引用(C++11引进了一个右值引用)。

引用是为对象起别名。引用在定义的时候一般必须初始化(作为形式参数可以不用初始化)。一旦引用初始化就只能和它的初始值绑定在一起,无法解绑。因此不能给引用重新绑定一个对象。

引用是给对象起别名,那么对引用的操作其实就是对原始对象的操作。

普通引用

引用的格式如下:

代码语言:javascript
复制
int a = 3;
int &A = a;        //A是一个引用

这时候对A的所有操作就等价于对a的所有操作。如下所示。

常量引用

我们可以定义如下的常量引用。

代码语言:javascript
复制
const int& p = 12;	//常量引用
const string& str = "qwert";

需要注意的是 非const引用必须和对象的类型完全相同,const则不要求去类型完全一致。如下所示:

代码语言:javascript
复制
int num = 123;
const int& n = num;    //ok

const int b = 456;
int& c = b;        //error

这里的变量c是无法绑定变量b的,但是n是可以绑定num变量的。

数组引用

C++没有引用数组,有数组引用。

因为引用数组本身是个数组,无法一下子初始化。而引用要求必须初始化。C++想让使用者知道引用是不占据内存的(引用的本质是指针常量,其实占据内存)。而数组引用的本质是一个引用,只不过引用的数组而已。

指针引用

指针引用只不过是引用绑定的对象是指针而已,其余的并没有什么特殊的。

可以看到引用n的属性和指针p的属性是一样的。同样可以通过*n = 300;来改变m的值。

返回值和引用

这点需要格外注意,引用不能返回一个局部变量,只能返回一个静态变量或者是全局变量。

代码语言:javascript
复制
#include<iostream>
#include<cstdlib>
#include<string>

using namespace std;
int m = 233;

int& fun(int a)
{
	int num = 3;
	return num;
}

int& fun()
{
	return m;
}

int& fun(string str)
{
	static int n = 1;
	return n;
}
int main(int argc,char *argv[])
{
	
	int &a = fun(1);
	int &b = fun();
	int& c = fun("Hello");
	cout << "a:" << a << endl;
	cout << "b:" << b << endl;
	cout << "c:" << c << endl;
        return 0;
}

输出如下:

可以看到a是乱码。这样能够证明引用的本质是给一块内存空间起别名。当int& fun(int a);函数运行结束的时候,局部变量num被释放,这时候返回它的引用就会引起错误。而全局变量和静态变量则没有问题。因为他妈的生存周期是整个程序运行期间。

引用常用来做函数的形参:因为这样不是值传递,从而使的对象作为参数时,不需要调用拷贝构造函数。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 普通引用
  • 常量引用
  • 数组引用
  • 指针引用
  • 返回值和引用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档