C++ 引用
本文主要记录了C++中的引用特性,总结了一下代码示例和错误。
简单的引用
引用是C++的特性,指针是C语言的特性。上面代码结果如下:
20
20
100
20
true
引用和被引用的对象是占用同一个内存单元的,具有同一的地址。
指针变量引用
对于引用,创建的时候就要说明引用的对象是哪一个,而且以后都不会修改这个引用的对象。引用就相当于一个变量的别名。
引用错误示例
交换2个字符串
- #include <iostream>
- #include <string.h>
- using namespace std;
- void swapOne(char *&x,char *&y)//指针的引用
- {
- char *temp;
- temp = x;
- x = y;
- y = temp;
- }
- void swapTwo(char **x,char **y)//指针的指针
- {
- char *temp;
- temp = *x;
- *x = *y;
- *y = temp;
- }
- void swapThree(char *x,char *y)//指针的传值(这种方法是不行的,相当于值传递)
- {//有人会误解这个,因为可能使用过 利用指针交换2个整数。这还是有差别的。
- char *temp;
- temp = x;
- x = y;
- y = temp;
- }
- int main()
- {
- char *ap = "Hello";//*ap的内容是H,*bp的内容是H
- char *bp = "How are you?";
- cout<<"ap: "<< ap << endl;
- cout<<"bp: "<< bp << endl;
- //swapOne(ap,bp);
- //swapTwo(&ap,&bp);
- swapThree(ap,bp);
- cout<<"swap ap,bp"<<endl;
- cout<<"ap: "<< ap << endl;
- cout<<"bp: "<< bp << endl;
- return ;
- }
引用错误示例2
- #include <iostream>
- using namespace std;
- const float pi=3.14f;//常量
- float f;//全局变量
- float f1(float r)
- {
- f = r*r*pi;
- return f;
- }
- float& f2(float r)//返回引用
- {
- f = r*r*pi;
- return f;
- //局部变量的引用返回(注意有效期),系统运行正常,但是结果会出错。
- /*float ff = f;
- return ff;*/
- }
- int main()
- {
- float f1(float=);//默认参数5,可以修改全局变量f=78.5
- float& f2(float=);//同上
- float a=f1();
- //float& b=f1();//f1()函数中,全局变量f的值78.1赋给一个临时变量temp(由编译器隐式建立),然后建立这个temp的引用b,对一个临时变量temp引用会发生错误
- float c=f2();
- float& d=f2();//主函数中不使用定义变量,而是直接使用全局变量的引用。这种方式在全部4中方式中,最节省内存空间。但须注意它所引用的有效期。
- //此处的全局变量f的有效期肯定长于引用d,所以安全。例如,将一个局部变量的引用返回。
- d += 1.0f;
- cout<<"a = "<< a <<endl;
- //cout<<"b = "<< b <<endl;
- cout<<"c = "<< c <<endl;
- cout<<"d = "<< d <<endl;
- cout<<"f = "<< f <<endl;
- return ;
- }
引用常见错误
- #include <iostream>
- using namespace std;
- class Test
- {
- public:
- void f(const int& arg);
- private:
- int value;
- };
- int main()
- {
- int a = ;
- const int b = ;
- //int &c = b;//错误:b为常量,但是C不是常量引用,正确的:const int &c=b;
- const int &d = a;
- a++;
- //d++;//错误,d为常量引用,所以不能修改
- Test test;
- test.f(a);
- cout << "a = "<< a <<endl;
- return ;
- }
- void Test::f(const int &arg)
- {
- //arg = 10;//常量不能修改
- cout <<"arg = "<< arg <<endl;
- value = ;
- }
- /*
- * 对于常量类型的变量,其引用也必须是常量类型的。
- * 对于非常量类型的变量,其可以是非常量的。
- * 但是,注意:无论什么情况下,都不能使用常量引用修改引用的变量的值。
- */
C++ 引用的更多相关文章
- 【.net 深呼吸】序列化中的“引用保留”
假设 K 类中有两个属性/字段的类型相同,并且它们引用的是同一个对象实例,在序列化的默认处理中,会为每个引用单独生成数据. 看看下面两个类. [DataContract] public class 帅 ...
- CSS 选择器及各样式引用方式
Css :层叠样式表 (Cascading Style Sheets),定义了如何显示HTML元素. 目录 1. 选择器的分类:介绍ID.class.元素名称.符合.层次.伪类.属性选择器. 2. 样 ...
- Android性能优化之巧用软引用与弱引用优化内存使用
前言: 从事Android开发的同学都知道移动设备的内存使用是非常敏感的话题,今天我们来看下如何使用软引用与弱引用来优化内存使用.下面来理解几个概念. 1.StrongReference(强引用) 强 ...
- C++中的引用
一,C++中引用的基础知识 1.引用的基本概念 1.所谓的引用其实就是对变量起“别名”.引用和变量对应得是相同的内存,修改引用的值,变量的值也会改变,和指针类似. 2.引用在定义的时候必须要初始化,初 ...
- Java 为值传递而不是引用传递
——reference Java is Pass by Value and Not Pass by Reference 其实这个问题是一个非常初级的问题,相关的概念初学者早已掌握,但是时间长了还是容易 ...
- EC笔记:第4部分:21、必须返回对象时,别返回引用
使用应用可以大幅减少构造函数与析构函数的调用次数,但是引用不可以滥用. 如下: struct St { int a; }; St &func(){ St t; return t; } 在返回t ...
- EC笔记:第4部分:20、传递引用代替传值
考虑以下场景: #include <iostream> #include <string> using namespace std; struct Person { strin ...
- 编译器开发系列--Ocelot语言2.变量引用的消解
"变量引用的消解"是指确定具体指向哪个变量.例如变量"i"可能是全局变量i,也可能是静态变量i,还可能是局部变量i.通过这个过程来消除这样的不确定性,确定所引用 ...
- C++右值引用浅析
一直想试着把自己理解和学习到的右值引用相关的技术细节整理并分享出来,希望能够对感兴趣的朋友提供帮助. 右值引用是C++11标准中新增的一个特性.右值引用允许程序员可以忽略逻辑上不需要的拷贝:而且还可以 ...
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...
随机推荐
- vuex2.0.0爬坑记录 -- mutations的第一个参数state不能解构
今天在学习vuex的过程中,遇到了一个很困扰人的问题,最终利用vuex的状态快照工具logger解决了问题. 问题是这样的,我在子组件中使用了mapState()函数来将状态映射至子组件中,使子组件能 ...
- rspec中的shared_examples与shared_context有什么不同
What is the real difference between shared_examples and shared_context ? My observations : I can tes ...
- rsync+inotify实现远程数据备份
一.rsync的基本介绍 1. 什么是rsync Rsync是一款开源的.快速的.多功能的.可以实现增量的本地货远程数据镜像同步备份的优秀工具,Rsync使用与unix,linux,windows等 ...
- (转)java中的进程与线程
(转自地址http://www.ibm.com/developerworks/cn/java/j-lo-processthread/) Java 进程的建立方法 在 JDK 中,与进程有直接关系的类为 ...
- Asp.Net 利用反射获得委托和事件以及创建委托实例和添加事件处理程序
子程序定义: public delegate void CurrentControlListenEvent(string uniqueID, string way = null); public ev ...
- Spring学习笔记 5. 尚硅谷_佟刚_Spring_自动装配
1,回顾以前的做法 一个人有姓名,有住址,有一辆车.其中住址和车也是一个类,这种情况下不用自动装配是十分容易实现的 (1)Person类 package com.zsq; public class P ...
- Oracle 服务手动启动关闭
在windows7中安装完Oracle11g之后会出现一下七种服务:可通过运行->services.msc查看. 其中各个服务名称中的ORCL或orcl为SID即System IDentifie ...
- Unity IOC容器的简单应用(转)
转自:http://blog.csdn.net/wanzhuan2010/article/details/7763280 Unity是Unity是微软patterns& practices组用 ...
- python 装饰器学习(decorator)
最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...
- OSD磁盘日常监控
摘要:对ceph OSD磁盘,做好定期的性能数据采集和通电时长管理,长期的数据积累对磁盘的性能与生命周期管理会有一定帮助,同时也能确保整个集群性能的稳定. 磁盘碎片管理 查看磁盘碎片 # xfs_db ...