资讯 小学 初中 高中 语言 会计职称 学历提升 法考 计算机考试 医护考试 建工考试 教育百科
栏目分类:
子分类:
返回
空麓网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
空麓网 > 计算机考试 > 软件开发 > 后端开发 > Java

C++ 引用

Java 更新时间: 发布时间: 计算机考试归档 最新发布

C++ 引用

1. 概述

引用的作用是给 变量 起一个 别名.

比如 int a = 10;  

a 就是这个变量的名称, 程序通过 操作 a 来操作 a代表的内存空间.

但可以通过引用, 让 b 也能代表这块空间, 然后就可以通过 b 来操作这段内存.

语法:

数据类型 &别名 = 原名;

int a = 10;//int &b = 10;  非法引用, 10并不存放在变量区.int &b = a; 

2. 引用的注意事项

1. 引用必须要经过初始化;

2. 引用在初始化之后, 就不可以更改.

a 和 c 的定义过程已省略.

int &b; //错误, 引用必须初始化, 没有原名的引用是非法的.int &b = a;int &b = c; //错误, 引用之后就不可以更改了.b = c; //正确, 因为这不是引用, 而是把 c 的值赋给 b.

3. 引用传递

详见函数篇C++ 函数_AusrEnder的博客-CSDN博客

4. 引用作函数返回值

 不要返回局部变量的引用

这和 栈区 的释放机制有关, 与 不要返回局部变量的地址 是一个道理.

子函数结束后, 通过引用或者地址访问局部变量地址都是非法的, 因为栈内存已经释放.

局部变量的保存与否, 取决于编译器. 所以最好不要这样做.

#include using namespace std;//不要返回局部变量的引用.//int & 类型作为返回类型, 说明函数返回的是局部变量的引用.int& function(){	int a = 10;	return a;}int main(){	int& ref = function();	cout << ref << endl;	cout << ref << endl;	return 0;}

如果一定要返回怎么办呢?

很简单, 不要让局部变量存放在栈区中就可以了.

已知局部常量也存放在栈区, 而静态变量存放于全局区, 所以用 static 修饰局部变量即可.

同时, 因为函数表达式就是返回值, 返回值类型为引用, 因此函数表达式等于变量名, 可以赋值.

#include using namespace std;//不要返回局部变量的引用.//int & 类型作为返回类型, 说明函数返回的是局部变量的引用.int& function(){	int a = 10;	return a;}int& function1(){	static int a = 20;   // static 修饰 表示这是一个静态变量, 存放于全局区	return a;}int main(){	int& ref = function();	cout << ref << endl;    //栈内存已经释放, 这是非法访问	cout << ref << endl;   	int& ref1 = function1();	cout << ref1 << endl;   // static 静态变量 存放于全局区, 即便栈区内存释放, 也不受影响, 访问合法	function1() = 1000;    // 引用作返回值时, 函数表达式相当于一个变量名, 因此可以作为左值,对其进行赋值.	cout << ref1 << endl;             //输出  1000 , 因为此时 ref1 和 function1 都为该段内存的变量名.	cout << function1() << endl;      //输出  1000 , 因为此时 ref1 和 function1 都为该段内存的变量名.	return 0;}

5. 引用的本质

引用在 C++ 内部本质是一个指针常量.

int a = 0;int &ref = a;  //编译器自动转换为  int * const ref = &a;ref = 20; //编译器发现 ref 是引用, 自动转换为 *ref = 20;
//发现是引用传递, 转换为 int * const ref = &a;void function(int &ref){   ref = 100;     //转换为 *ref = 100} int main(){   int a = 10;   function(a);   return 0 ;}

6. 常量引用

引用传递和地址传递一样会影响实参, 若又想保护实参, 又不想用值传递, 就可以用

const 修饰的指针来地址传递. 当然, 也可以用 const 修饰的引用传递.

(因为指针常量只保护指针指向, 不保护指向的值.)

void function(const int &ref){   ref++; //报错,因为 const 修饰引用, ref不是可以修改的左值.}
int a = 10;//int &b = 10;  //非法引用, 10并不存放在变量区.int &b = a; //int & ref = 10;  //非法引用, 同上const int & ref = 10;  //合法引用, 编译器分配临时变量名并引用.                       //转换为 int temp = 10;  const int & ref = temp;                       //再转换为 const int * const ref = &temp;ref = 20;  //报错, 常量引用后 ref 的值不可以修改.
转载请注明:文章转载自 http://www.konglu.com/
本文地址:http://www.konglu.com/it/1095150.html
免责声明:

我们致力于保护作者版权,注重分享,被刊用文章【C++ 引用】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2023 成都空麓科技有限公司

ICP备案号:蜀ICP备2023000828号-2