博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++Primer 变量与引用
阅读量:2432 次
发布时间:2019-05-10

本文共 1896 字,大约阅读时间需要 6 分钟。

变量和对象对于C++程序员来说,一般可以互换使用

初始值:当对象在创建时获得了一个特定的值,我们就说这个对象被初始化了
在C++语言中,初始化是一个异常复杂的问题,很多程序员对于用=来初始化变量的方式倍感困惑,这种方式让人认为初始化是赋值的一种。实事上在C++语言中,初始化和赋值是两个完全不同的操作。
初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来代替。
默认初始化:
如果定义变量时没有指定初值,则变量被默认初始化,此时变量被赋予“默认值”
如果是内置类型的变量未被显式初始化,它的值由定义的位置决定。定义于任何函数体之外的变量被初始化为0。定义在函数体内部的内置类型变量将不被初始化。一个未被初始化的内置类型变量的值是未定义的,如果试图拷贝或者以其他形式访问此类值将引发错误。
定义于函数体内的内置类型的对象如果没有初始化,则其值是未定义。类的对象如果没有显式地初始化,则其值由类确定
练习2.10:下列变量的初值分别是什么?

std::string global_str;int global_int;int main(){
int local_int; std::string local_str;}

对于string对象来说,本身含有接受无参的初始化函数,所以无论是在函数内外,它的值都是一个空字符串。对于内置类型int来说,函数体之外被初始化为0,而函数体内部未被初始化其结果是未被定义的,如果试图使用该变量将会发生错误。

变量声明和定义的关系:
C++语言将声明和定义区分开来。声明使得名字为程序所知,而定义负责创建与名字关联的实体
如果想要声明一个变量而非定义它,就在变量名前添加关键字extern,而且不要显式地初始化变量。
如果要在多个文件中使用同一个变量,就必须将声明和定义分离。此时,变量的定义必须出现在且只能出现在一个文件中,而其他用到该变量的文件必须对其进行声明,却不能重复定义。
练习2.11:指出下面的语句是声明还是定义:

(a) extern int ix = 1024;    //定义了变量ix(b) int iy;   //声明并定义了变量iy(c) extern int iz;   //声明了变量iz

引用

引用为对象起了另一个名字,引用类型引用另一种类型

int ival = 1024;int &refVal = ival;   //refVal指向ival(是ival的另一个名字)int &refVal2;  //报错,引用必须初始化

一般在初始化时,初始值会被拷贝到新建的对象中。然而定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用将和它的初始值对象一直绑定在一起。因此无法令引用重新绑定到另一个对象,因此引用必须初始化。

引用并非对象,相反的,它只是为一个已经存在的对象所起的另一个名字。
定义了一个引用之后,对其进行的所有操作都是在与之绑定的对象上进行的
因为引用本身不是一个对象,所以不能定义引用的引用。而且,引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起

练习2.15:下面哪个定义是不合法的?

(a) int ival = 1.01;(b) int &rvall = 1.01;  //非法,不能和字面值绑定在一起(c) int &rval2 = ival;(d) int &rval3;    //非法,引用必须初始化

练习2.16:哪些赋值是不合法的?

int i = 0, &r1 = i; double d = 0, &r2 = d;(a) r2 = 3.14159;   //合法,为引用赋值,实际上将值赋值给了引用所绑定的对象(b) r2 = r1;     //合法,以引用作为初始值实际上是以引用绑定的对象作为初始值(c) i = r2;     //合法,执行了窄化操作(d) r1 = d;    //合法,执行了窄化操作

指向指针的引用

引用本身不是一个对象,因此不能定义指向引用的指针。但指针是对象,所以存在对指针的引用

int i = 42;int *p;   //p是一个int类型的指针int *&r = p;   //r是一个对指针p的引用r = &i; //r引用了一个指针,因此给r赋值相当于令p指向i*r = 0; //将i的值修改为0

要理解r的类型到底是什么,最简单的办法就是从右向左阅读 r 的定义。离变量名最近的符号,对变量的类型有着直接的影响。

转载地址:http://evxmb.baihongyu.com/

你可能感兴趣的文章
盛食厉兵 中科天玑挖掘大数据价值助力行业数字化转型
查看>>
白鹭引擎正式支持微信小游戏开发
查看>>
2018年,你所不知道的Jira!
查看>>
2017年,阿里巴巴开源的那些事
查看>>
推动边缘计算的七项核心技术
查看>>
边缘计算精华问答 | 边缘计算需要IaaS、PaaS、SaaS等服务能力吗?
查看>>
Spark精华问答 | Spark 会替代Hadoop 吗?
查看>>
豆瓣已玩烂,来爬点有逼格的 ——IMDB 电影提升你的品位
查看>>
一部刷爆朋友圈的5G短片,看完才知道5G多暖多重要!
查看>>
SDN精华问答 | SDN可以做什么?
查看>>
云评测 | 开发者最有用的开源云监控工具有哪些呢? 这7款神器总有一款适合你!...
查看>>
小团队的微服务之路
查看>>
K8S精华问答 | Kubernetes集群不能正常工作,难道是防火墙问题?
查看>>
5G精华问答 | 什么是5G?5G与LTE有什么关系?
查看>>
虎牙直播在微服务改造方面的实践和总结
查看>>
微服务精华问答 | 在使用微服务架构时,您面临哪些挑战?
查看>>
Kubernetes 调度器实现初探
查看>>
边缘计算精华问答 | 边缘计算有哪些应用场景?
查看>>
数据中台精华问答 | 数据中台和传统数仓的区别是什么?
查看>>
如何用30分钟快速优化家中Wi-Fi?阿里工程师有绝招
查看>>