本文主要记录了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++ 引用的更多相关文章

  1. 【.net 深呼吸】序列化中的“引用保留”

    假设 K 类中有两个属性/字段的类型相同,并且它们引用的是同一个对象实例,在序列化的默认处理中,会为每个引用单独生成数据. 看看下面两个类. [DataContract] public class 帅 ...

  2. CSS 选择器及各样式引用方式

    Css :层叠样式表 (Cascading Style Sheets),定义了如何显示HTML元素. 目录 1. 选择器的分类:介绍ID.class.元素名称.符合.层次.伪类.属性选择器. 2. 样 ...

  3. Android性能优化之巧用软引用与弱引用优化内存使用

    前言: 从事Android开发的同学都知道移动设备的内存使用是非常敏感的话题,今天我们来看下如何使用软引用与弱引用来优化内存使用.下面来理解几个概念. 1.StrongReference(强引用) 强 ...

  4. C++中的引用

    一,C++中引用的基础知识 1.引用的基本概念 1.所谓的引用其实就是对变量起“别名”.引用和变量对应得是相同的内存,修改引用的值,变量的值也会改变,和指针类似. 2.引用在定义的时候必须要初始化,初 ...

  5. Java 为值传递而不是引用传递

    ——reference Java is Pass by Value and Not Pass by Reference 其实这个问题是一个非常初级的问题,相关的概念初学者早已掌握,但是时间长了还是容易 ...

  6. EC笔记:第4部分:21、必须返回对象时,别返回引用

    使用应用可以大幅减少构造函数与析构函数的调用次数,但是引用不可以滥用. 如下: struct St { int a; }; St &func(){ St t; return t; } 在返回t ...

  7. EC笔记:第4部分:20、传递引用代替传值

    考虑以下场景: #include <iostream> #include <string> using namespace std; struct Person { strin ...

  8. 编译器开发系列--Ocelot语言2.变量引用的消解

    "变量引用的消解"是指确定具体指向哪个变量.例如变量"i"可能是全局变量i,也可能是静态变量i,还可能是局部变量i.通过这个过程来消除这样的不确定性,确定所引用 ...

  9. C++右值引用浅析

    一直想试着把自己理解和学习到的右值引用相关的技术细节整理并分享出来,希望能够对感兴趣的朋友提供帮助. 右值引用是C++11标准中新增的一个特性.右值引用允许程序员可以忽略逻辑上不需要的拷贝:而且还可以 ...

  10. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

随机推荐

  1. jsp:软件包 javax.servlet 不存在

    jdk里面有javax.servlet和javax.servlet.http这两个包吗? JavaServlet程序运行还需要安装JDK以外的包吗...? why?我运行JavaServlet程序的时 ...

  2. centos 如何清理/dev/vda1系统盘

    df-h检查一台服务器磁盘使用空间,发现磁盘已经使用了100% 思路是: 1.cd /usr 2.du -sh * 看哪个目录占用空间大 3.重复前两步,根据实际情况删除或者移走 4.日志的话可以运行 ...

  3. text-align:justify的使用

    在平常的开发过程中,对于text-align一般用到的是left,center,right,这三个属性都不会陌生.然而,对于justify的使用我却是很陌生.首先有个比较简单的例子. 首先是html代 ...

  4. json_encode中文unicode的问题

    近期做微信卡券开发遇到一个问题,创建卡券post数据给服务器时返回data format error, do NOT use json unicode encode (/uxxxx/uxxxx), p ...

  5. mysql 5.7开启并行复制

    开启多线程复制,默认关键的参数有两个: mysql> show variables like 'slave_parallel_%'; +------------------------+---- ...

  6. Matlab 语谱图(时频图)绘制与分析

    Matlab 语谱图(时频图)绘制与分析 语谱图:先将语音信号作傅里叶变换,然后以横轴为时间,纵轴为频率,用颜色表示幅值即可绘制出语谱图.在一幅图中表示信号的频率.幅度随时间的变化,故也称" ...

  7. 好文推荐系列---------JS模板引擎

    这篇文章写的很清晰,不再赘述,直接上链接:http://www.tuicool.com/articles/aiaqMn

  8. Ubuntu 中 不显示WIFI解决方法

    先用有线接到网络,打开终端,执行以下命令sudo apt-get update sudo apt-get install --reinstall bcmwl-kernel-source 执行成功即可看 ...

  9. vijos1910解方程

      描述 已知多项式方程: a0+a1x+a2x2+...+anxn=0a0+a1x+a2x2+...+anxn=0 求这个方程在[1, m]内的整数解(n 和 m 均为正整数). 格式 输入格式 输 ...

  10. SQL分页常用的两个存储过程

    在做数据绑定时,我们常常会遇到分页事件,下面记录一下分页常用到SQL的两个存储过程 ①/****分页数据总数****//****** 对象:  StoredProcedure [dbo].[GetRe ...