1.引用的本质

int b = 10;

int &a = b;

等效于:

int * const a = &b;

由于 a 是 const声明,所以一旦定义无法修改,所以要在定义时就要赋初值。

实际使用时:

a = 10;   ==> *b = 10;

2. 引用于函数结合

(1)引用做函数参数

int func(int &a)

{

...

}

使用时:

int b = 10;

func(b);

为了分析语法,将其转换为指针,编译器在实参给形参赋值时:

int &a = b;   ===>   int *const a = &b;

实际使用:

a = 10; ===> *b = 10;

所以实现了间接赋值。

(2)引用做函数返回值

int &func()
{
   ;
   return ret;
}

int main(){   int a = func();     // gcc 中,这里出现段错误   int &b = func();   cout << a << endl;      cout << b << endl;   // gcc 中,这里段错误}

在 VS 中,debug版本和 release版本的输出不同。

所以上面的代码是错误的。

分析原因:

int a = func();  ==>

int &tmp = ret;  === >  int *const tmp = &ret;

a = tmp;       ===>  a = *(&ret);

其中 tmp 是 隐藏变量,一般在寄存器中。

由于 函数返回后,局部变量 ret 空间释放,所以对无效空间的访问是未知的。

int &b = func(); ==>

int &tmp = ret;   ===> int *const tmp = &ret;

int &b = tmp;     ===> int *const b = tmp;  ==>  int *const b = &ret;

可以看出这里不存在非法地址访问,所以这句不会报错。

cout << b << endl; ===> cout << *(&ret) << endl;

这里是非法地址访问。报错

由于上面的非法地址访问的本质原因是栈空间的释放,所以如果变量的存储类在堆或数据段就不会有错。

3. 引用与指针

(1)引用指针

int &b = c;

int & * a = &b;

上面的表达式是错误的,因为 指针不能指向引用,原因是 C++之父 不希望 引用和指针一样出现多级引用,同理也没有 引用的引用。

(2)指针引用

int *b = &c;

int * & a = b;

这是成立的,相当于:

int * * const a = &b;

4. 引用与 const

(1)使用变量初始化常引用

int a = 10;

const int &b = a;

a = 11;

b = 12;  // 错误

通过常引用赋予变量只读属性。

(2)使用字面量初始化常引用

int &a = 10;    // 错误,因为字面量没有地址,无法引用

const int &b = 10;

常引用可以引用字面量,当常引用引用字面量时,C++编译器为字面量分配空间,并让常引用符号作为该空间的别名。

C++ 基础 引用的更多相关文章

  1. java基础-引用数据类型之二维数组(Array)

    java基础-引用数据类型之二维数组(Array) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我们学习过了Java的一维数组,所谓的二维数组就是元素是一堆一维数组的数组,换 ...

  2. java基础-引用数据类型之一维数组(Array)

    java基础-引用数据类型之一维数组(Array) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组的定义 1>.为什么需要数组 保存一个数据可以定义一个变量,如果要保 ...

  3. Java基础-引用数据类型之集合(Collection)

    Java基础-引用数据类型之集合(Collection) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么出现集合类 面向对象语言对事物的体现都是以对象的形式,所以为了方便 ...

  4. C++ 基础中的基础 ---- 引用

    C++ 基础中的基础 ---- 引用 引用的概念:引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量.比如: int n ...

  5. Java 基础 引用数据类型 ArrayList集合

    引用数据类型(类) 分类 提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类.Random类. 我们可以把类的类型为两种: 第一种,Java为我们提供好的类,如Scanner类, ...

  6. Java 基础 引用数据类型 和 流程控制

    引用数据类型 与定义基本数据类型变量不同,引用数据类型的变量定义及复制有一个相对固定的步骤和格式: 数据类型 变量名 = new 数据类型(); 如:String st = new String(); ...

  7. css基础 引用方式 标签选择器 优先级 各式布局

    今天讲的css基础,了解了css即层叠式表,是美化网页,控制页面的样式. 样式表引进网页的3种方式1内联式,语法例子:<div style="width: 100px;height: ...

  8. Django基础(一):基础引用

    Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 半成品自定义web框架 impor ...

  9. LinuxC/C++基础——引用

    1.引用(Reference) 1.1引用的基本语法 引用是C++对C的重要扩充,也存在与其他一些编程语言中,并不是C++的发明.通过引用,C++增加了 另外一种给函数传递地址的途径,这就是按引用传递 ...

随机推荐

  1. url长度

    今天在测试Email Ticket的时候发现在进行Mark as Read/Unread操作时,请求是通过GET方式进行的.URL中列出了所有参与该操作的Ticket Id.于是,我想起GET请求是有 ...

  2. 在thinkpad SL400上U盘安装双系统ubuntu14.10

    转自:http://zydky.iteye.com/blog/1674100 上文中装的双系统是centos6.3,因为自己对ubuntu有点熟悉,就装了ubuntu. 笔记本是09年入手的,买了之后 ...

  3. >>我要做特工系列 之 CSS 3_animation_向右滑出后下滑并停止

    新手入门还没有正式发点啥东西,都是在装潢博客这个家了,到现在为止还是没有装修好..熟悉了这边的发布规范之后会持续在这里记录,给自己留下学习的脚印~ 这正式的第一篇随笔写个使用css3的动画效果. 总感 ...

  4. Debug view 是个好工具

    有时候不用 VS 调试, 在 代码里面加入 Debug.Writeline(" Debug information!!");  这个时候打开 debug view 就可以检测出输出 ...

  5. js报错 object is not a function

    主要是js函数名重名了,重命名就可以了.

  6. angularjs ng-if 慎用 备忘

    ng-if.ng-show一般情况下可以通用,二者的最明显区别就是: ng-if判断为false时,页面dom节点不会被创建,其子节点下也不会渲染,从而也就加快了dom的加载速度:ng-show则仅是 ...

  7. Ubuntu 14.04 软件源服务器集合

    http://wiki.ubuntu.com.cn/Template:14.04source 服务器列表 可将 http://cn.archive.ubuntu.com/ubuntu/ 替换为下列任意 ...

  8. python定义class

    python也是面向对象的语言,类的重要性不言而喻. class Animal: def __init__(self,voice='hello'): self.voice=voice def __de ...

  9. 新人学习微信小程序开发之框架篇

    大家好我是智哥,一名专注于前端领域的一名码农. 咱们今天主要来说说微信小程序, 最近一段时间微信群里的小程序,小游戏各种分享是突然一下子就爆发了,现在来看小程序作为微信的重磅功能无疑又是下一个风口.咱 ...

  10. Python -函数的参数定义

    一.函数的参数有四种,位置参数.默认参数.可变参数和关键字参数 def func(x, y=0, *arg, **args): '''x为位置参数 y有默认值 *arg为可变参数 **args为关键字 ...