本文主要记录了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. android免root兼容所有版本ui调试工具

    SwissArmyKnife是什么 SwissArmyKnife 是一款方便调试android UI的工具,可以兼容所有android版本,不需要root权限.可以直接在android手机屏幕上显示当 ...

  2. 使用zabbix邮件发送报表

    简介 首先我们来看下图片的url (右击screens中随便一张图片,选复制图片地址) http://zabbix.xxx.com/chart2.php?graphid=524&screeni ...

  3. 利用FPGA加速实现高性能计算

    原文链接 原因:处理器本身无法满足高性能计算(HPC)应用软件的性能需求,导致需求和性能 之间出现了缺口. 最初解决办法:使用协处理器来提升处理器的性能. 协处理器(基于硬件的设计)具有三种能力: 1 ...

  4. Centos 6.X基本维护操作

    设置163源,全新最小化安装时,更改源需先yum install wget mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-B ...

  5. Python排列组合问题

    1.字符串的全排列 问题描述:打印出原字符串中所有字符的所有排列.——将输入字符串中的每个字符作为一个不同的字符看待,即使它们是重复的,如'aaa'应打印6次. Python可以用生成器解决: def ...

  6. col-md-*,col-xs-*

    class属性 col-md-*,md 表示 medium (中等的),* 代表一个数字,它指定了这个元素所占的列宽. 在中等大小的屏幕上(例如笔记本电脑),元素的列宽被指定了. col-xs-* , ...

  7. JAVA单例的三种实现方式

    1. public class MySingleton { private MySingleton() {} private MySingleton instance = new MySingleto ...

  8. mottoes

    1. You don't kown if you can until a try. 2. Rule youself. 3. It's what you do in the dark that puts ...

  9. 第8章 NAND FLASH控制器

    8.1 NAND Flash介绍和NAND Flash控制器使用 NAND Flash在嵌入式系统中的地位与PC上的硬盘类似 NAND Flash在掉电后仍可保存 8.1.1 Flash介绍 有NOR ...

  10. 图解HTTPS

    看到一篇讲解HTTPS交互的文章,讲得很清楚,备忘一下 来自无网不剩的博客 我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取.所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTP ...