Chapter2,Section2.2——Variables
变量
变量定义:类型名 变量名1,变量名2,变量名3,......;
变量在定义时可以赋初值,也可以不赋初值。
变量初始化和赋值是不同的。初始化是在变量被创建给变量指定一个值时,赋值是把变量当前值用一个新的值来代替。
C++提供了多种初始化变量的方法,例如我们可以用下面四种方法中的任意一种初始化变量u。
(1)int u = 0 ;
(2)int u = {0} ;
(3)int u{0} ;
(4)int u(0) ;
当用初始化列表{}初始化内置类型变量时有一个重要的属性:
编译器不允许在可能导致信息丢失的情况下用初始化列表对内置类型变量进行初始化操作。
当定义了一个变量但是没有进行初始化时,变量会有一个默认值。变量的默认值具体是什么取决于变量的类型和变量定义的位置。
一个为进行初始化的内置类型变量的默认值取决于它被定义的位置。
定义在任何函数体之外的变量的默认值是0。
定义在函数体内的内置类型变量如果未被手动初始化,则其默认值是undefined。使用undefined值的操作会出错。
String类的默认值是空。
未被初始化的内置类型变量如果定义在函数体内,其值是undefined。
类类型对象如果未被精确地初始化,其初值由类定义。
对于内置类型最好都进行初始化,否则可能会引起错误。除非你很确定不进行初始化是安全的。
变量声明和定义
在C++中,变量的声明和定义是不同的。
(一)变量的声明:
(1)变量的声明是告诉程序有这样一个名字,一个变量的声明指出了变量的类型和名字。
(2)为了得到一个声明而不是定义,我们增加了关键字extern并且不提供一个精确的初始化值。
(3)任何包括精确初始化值的声明都是定义。
(4)一个extern如果含有精确地初始化值,那它就是定义。
(5)变量可以被定义一次,但是能被声明多次。
(6)一个文件如果想要使用在别处定义的一个名字必须要对这个名字进行声明。
(7)要想在多个文件中使用同一个变量,我们只能在一个文件中定义这个变量,其他想使用这个变量的文件必须对 这个变量进行声明,而不是定义。
(二)变量的定义:
变量的定义创建了一个相关的实体。一个变量的定义除了指出了变量的类型和名字,还可能分配内存和提供给变量一个初值。
例如:
(1)extern int i; //声明但是未定义i。
(2)int j; //声明并定义了j。
(3)extern double pi = 3.1416; //定义了pi
C++是静态类型语言,这就意味着类型检查是在编译时进行的。
标识符
C++中标识符由字母,数字,下划线组成。必须以字母或是下划线开头,区分大小写。不能和关键字、操作符重名。
一些定义标识符的约定:
(1)见名知意。
(2)变量名通常都是由小写字母组成。
(3)类名通常以大写字母开头。
(4)由多个单词组成的变量名必须能够相互区分开,比如中间加下划线,第二个及后面的单词首字母大写。
C++primer(英文版)中说到:标识符不能包含两个连续的下划线,也不能在以下划线开头的标识符中开头下划线的 后面立即加上大写字母。另外,定义在函数外面的标识符不能以下划线开头。
但是我通过测试,这些情况都是可以的,这是怎么回事,是我理解有误吗?
一个名字的作用域
每一个正在被使用的名字都指定了一个实体——一个变量,函数,类型等。
一个名字的有效作用域是距离它最近的一对花括号之间的范围。
全局作用域
块作用域
嵌套作用域——内作用域
——外作用域
在定义变量时,最好从哪里开始使用它,就从哪里开始定义它。
当全部变量了局部变量重名时(最好不要这样定义),在局部范围内,:
如果名字相同的局部变量未定义,则相应的全局变量有效。
如果名字相同的局部变量定义了,则该局部变量有效,此时若想使用全局变量,要在全局变量名前面加上作用域标识符::。