变量的基本知识
一、变量初始化规则
1、内置类型变量的初始化
内置类型变量是否自动初始化取决于变量定义的位置。在函数体外定义的变量都初始化成0,在函数体内定义的内置类型变量不进行自动初始化。除了用作赋值操作符的左操作数,未初始化变量用作任何其他用途都是没有定义的。未初始化变量引起的错误难以发现。
2、类类型变量的初始化
类通过定义一个或多个构造函数来控制类对象的初始化。
默认构造函数。
例如:string类定义了默认构造函数来初始化string变量为空字符串,即没有字符的字符串。
有些类类型没有默认构造函数。对于这些类型来说,每个定义都必须提供显式的初始化式。没有初始值是根本不可能定义这种类型的变量的。
二、声明和定义
①变量的定义:用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。
②声明:用于向程序表明变量的类型和名字。可以通过使用extern关键字声明变量名而不定义它。
extern声明不是定义,也不分配存储空间。它只说明变量定义在程序的其他地方。程序中变量可以声明多次,但只能定义一次。
只有声明也是定义时,声明才可以有初始化式,因为只有定义才分配存储空间。初始化式必须要有存储空间来进行初始化。
如果声明有初始化式,那么它可以被当作是定义,即使声明标记为extern:
extern double pi=3.1416;
虽然使用了extern,但是这条语句还是定义了pi,分配并初始化了存储空间。只有当extern声明位于函数外部时,才可以含有初始化式(即全局变量)。
三、const对象默认为文件的局部变量
在全局作用域里定义非const变量时,它在整个程序中都可以访问。我们可以把一个非const变量定义在一个文件中,假设已经做了合适的声明,就可在另外的文件中使用这个变量。
与其他变量不同,除非特别说明,在全局作用域声明的const变量是定义该对象的文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问。
非const变量默认为extern。要使const变量能够在其他的文件中访问,必须显式地指定它为extern。
四、引用
不能定义引用类型的引用,但可以定义任何其他类型的引用。
const引用是指向const对象的引用。
非const引用只能绑定到与该引用同类型的对象。
const引用则可以绑定到不同但相关的类型的对象或绑定到右值。
const引用不能进行赋值。
五、枚举
定义和初始化枚举:enum open_modes{input,output,append};
枚举成员是常量。
不能改变枚举成员的值。
枚举类型的对象的初始化或赋值,只能通过其枚举成员或同一枚举类型的其他对象来进行。
例如:
enmu Points{point2d=2,point2w,point3d=3,point3w};
Points pt3d=point3d;对的
Points pt2w=3;错
pt2w=polygon;错,因为polygon不是Points的成员
pt2w=pt3d;对的
六、类类型
七、使用struct关键字
如果使用class关键字来定义类,那么定义的第一个访问标号前的任何成员都隐式指定为private,如果使用struct关键字,那么这些成员都是public。使用class还是struct关键字来定义类,仅仅影响默认的初始访问级别。
八、编写自己的头文件
头文件一般包含类的定义、extern变量的声明和函数的声明。
头文件用于声明而不是用于定义。
头文件可以定义类、值在编译时就已知的const对象(用常量表达式来初始化)和inline函数。
定义一般放在源文件中。