`
cloudtech
  • 浏览: 4615460 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

以实践的方式学习C++ &(引用)

 
阅读更多
1.第一个例子:

假设:

int var1 = 224; //存放var1的值224的内存地址是0x12ABCDEF
则以下Code:
int var2 = var1;   // 将var1的值复制给var2.
int& var2 = var1;//var2 是var1 的别名(var2是var1的引用),var1= var2 = 224,var1的值未发生复制,它们的值的地址都是0x12ABCDEF

int var2 = &var1; //错误, &var1是存储变量var1的值224的地址。 (&在这里是取地址的意思)


var2是var1的别名的意思是,每个变量名代表着内存中的一个块数据,而var2与var1代表的是同一块,所以下面:

var2 = 1104;//此后 var1 也等于1104


2.第2个例子:

class Foo

{

public:

    int& setVar1(){return var1;}	//返回Foo类的成员变量var的一个别名

    void setVar2(int& t){ var2= t;}	//调用函数传递参数时是以引用方式传递

private:

    int var1;

    int var2;

};



Foo foo;

int i = 224;

int j = 1104;

foo.setVar() = i;   //引用可以作为左值,foo的成员var1现在是224

foo.setVar2(j);    //foo的成员var2现在是1104.

在调用方法setVar2时,由于形参t的类型是引用(int&),所以传递实参时实际上没有复制的动作。因为var2的类型定义为int(而不是int&) ,所以var2= t发生了一次值得复制,j的值被复制给var2,修改j的值不会影响var2.


3.第3个例子

class BigSizeClass
{
//这是一个很占内存空间的类
....
};
void func1(const BigSizeClass& var); //调用函数传递参数时是以引用方式传递,参数传递的只是变量的别名,而不是将BigSizeClass的实例化对象var复制一次,再传递给func1().
void fun2(const BigSizeClass* var); //参数传递的只是指向变量的地址,实参传递的过程中,var也未被复制。
//从这里看,& 与 *有点相似,在调用函数进行参数传递时,实参都没有发生复制,减少了调用时的时间空间的开销。


4.第4个例子

class Foo

{

public:

	Foo(){m_var = 1104;}

	int& var(){return m_var;}

private:

	int  m_var;

};


Foo foo;

foo.var() = 224;		//(1)获得了foo.m_var的一个别名,所以foo.m_var通过赋值后变为224.

int i = foo.var();		//(2) i的类型是int ,不是int & ,所以i新开辟了一段内存空间,程序将foo.m_var的值224复制到此内存空间中。

int& j = foo.var();		//(3) j的类型是 int & ,它是 foo.m_var的别名,指向foo.m_var的内存空间。

return 0;

5.第5个例子

class Foo

{

public:

	Foo(){m_var = 0;}

	int fun1(){return m_var;}

	int& fun2(){return m_var;}

private:

	int m_var;

}



int main()

{

	Foo foo;

	int var1 = foo.fun1();	//correct,无需解释  

	int& var2 = foo.fun1(); //error,编译器报错

	//invalid initialization of non-const reference of type ‘int&’ from a temporary of type ‘int’

	int var3 = foo.fun2();		//correct,回顾一下第1个例子

	int& var4 = foo.fun2();		//correct,var4是foo.m_var的引用

     var4 = 4;                       //correct,现在foo.m_var=4,

}


分享到:
评论

相关推荐

    Effective Modern C++学习笔记

    《Effective Modern C++:改善C++11和C++14的42个具体做法(影印版)(英文版)》中包括以下主题:剖析花括号初始化、...如何修改老C++编程(比如C++98)中的实践,使之符合现代C++的软件开发规范。此文档是该书的读书笔记。

    21天学通c++ 一本不错的学习教程

    第五篇的内容主要是C++编程实践,主要分析了标准模板库STL、模板与C++标准库和异常处理等;最后一篇中结合学生成绩管理系统开发实例,讲解如何使用C++进行实际开发。 本书适合没有编程基础的C++语言初学者作为入门...

    由浅入深学C++基础进阶与必做300题 源程序

    由浅入深学C++基础进阶与必做300题 源程序 解压后122M C++是近年广泛使用的程序设计语言,由C语言的基础上发展而来,实现 ...本书适台所有想全面学习C++开发技术的人员阅读,尤其适合没有 编程基础的C++

    Accelerated C++源代码

     无数程序员曾使用本书的前几个版本学习C++,在此期间C++也逐渐发展成熟。这些年来,C++语言的发展方向以及C++程序员的关注点,已经从以往注重运行时的效率,转到千方百计地提高程序员的编程效率上。随着标准库的...

    深入应用C++11:代码优化与工程级应用

    本书的内容来源于C++11项目实践,写作此书的目的是为了和广大读者分享学习和应用C++11的经验和乐趣。本书分为两篇,第一篇主要是介绍一些常用的C++11特性,介绍这些特性是如何优化C++11以前的一些代码的,读者可以...

    《由浅入深学C++-基础、进阶与必做300题》pdf格式 (完整版 带目录

    本书适合所有想全面学习C++开发技术的人员阅读,尤其适合没有编程基础的C++语言初学者作为入门教程,也可作为大、中院校师生和培训班的教材,对于C++语言开发爱好者,本书也有较大的参考价值。 章节目录: 第1篇 ...

    [C++.核心思想] 中文版

    本书通过使用标准C++语言的新特性,如引用参数、流库、string类以及vector模板,从而最大限度地避免使用易于出错的程序结构。指针也只主要应用在多态和链表的实现上。 ● 较早引入对象。本书分两个阶段介绍对象。从...

    Accelerated C++ PDF 中英文版

     无数程序员曾使用本书的前几个版本学习C++,在此期间C++也逐渐发展成熟。这些年来,C++语言的发展方向以及C++程序员的关注点,已经从以往注重运行时的效率,转到千方百计地提高程序员的编程效率上。随着标准库的...

    C++编程思想[第一卷]

    作者Bruce Eckel不是按传统的方法讲解C++的概念和编程方法,而是根据他自己过去学习C++的亲身体会,根据他在多年教学实践中发现的问题,用一些非常简单的例子和简练的叙述,阐明了在学习C++中特别容易混淆的概念。...

    c++实习报告.doc

    通过该课程的学习,要求学生掌握C++程序设计基础知识, 程序设计方法与基本数据结构。通过上机实践培养学生分析具体问题,建立数学模型, 用C++解决实际问题的能力,培养学生创新意识和提高学生实践能力。 二、教学...

    Visual C++串口通信技术详解.(机械工业.李景峰.杨丽娜.潘恒)

    书中实例的源代码均在随书光盘中提供,以方便读者学习和使用。 本书可作为具有一定Visual c++使用基础的读者开发串口通信程序的参考书,也可作为科研单位、高等院校相关专业技术人员的参考书 目录 前言 第一篇 ...

    aybook.cn_c++jiaocheng0105.rar

    本书为C++编程入门读物,面向没有编程经验的程序设计及C++语言的初学者,适合作为高等院校计算机专业相关课程教材,也可为广大编程爱好者深入学习C++及其他面向对象语言打下坚实的基础。 第1章 C++的发展历程 1.1...

    C++网络爬虫项目

    空间,比如将“网页下载”以多线索(进程或线程)并发的方式实现,甚至将 “DNS解析”也处理为并发的过程,以避免爬虫系统的I/O吞吐率受到网站服 务器和域名解析服务器的限制。而对于“已抓取URL队列”则可以采用...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    1.5 关于C++上机实践 习题 第2章 数据类型与表达式 2.1 C++的数据类型 2.2 常量 2.2.1 什么是常量 2.2.2 数值常量 2.2.3 字符常量 2.2.4 符号常量 2.3 变量 2.3.1 什么是变量 2.3.2 变量名规则 2.3.3 定义变量 ...

    httpserver:学习socket网络编程,学习C++类的封装

    学习socket网络编程,学习C++类的封装 参考我总结的网络编程实践 试图解决其中提到的一些问题。 第一期任务 (已经完成) 2015/03/04 完成了基本的框架搭建,使用scons管理项目 完成了tcp socket的简单封装 实现最简单...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    1.4.1 学习C++ 4 1.4.2 C++标准 5 1.4.3 属性 5 1.4.4 控制台应用程序 5 1.4.5 Windows编程概念 6 1.5 集成开发环境简介 7 1.5.1 编辑器 8 1.5.2 编译器 8 1.5.3 链接器 8 1.5.4 库 8 1.6 使用IDE 8 ...

    Visual C++ 2005入门经典--源代码及课后练习答案

     本书系编程语言先驱者Ivor Horton的经典之作,是学习C++编程最畅销的图书品种之一,不仅涵盖了Visual C++ .NET编程知识,还全面介绍了标准C++语言和.NET C++/CLI。本书延续了Ivor Horton讲解编程语言的独特方法,...

    C++微服务架构及安全云盘项目实训

    学完《C++微服务架构及安全云盘项目实训》课,您将学到:从实践中理解软件工程,学习需求分析、架构设计、详细设计文档的编写,学习编程规范,了解多人协作开发策略,理解并引用软件的版本管理,熟悉git工具和软件...

Global site tag (gtag.js) - Google Analytics