一、基本内置类型与类类型
C++中数据类型分为:基本内置类型与类类型。基本内置类型指:布尔型,字符型,整型,浮点型等。
二、字面值常量
1、只有内置类型存在字面值,没有类类型的字面值。
2、定义长整型时,应使用大写字母L,小写字母l易与数值1混淆。
3、字符字面值通常用一对单引号来定义。
4、C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符。字符串字面值由一对双引号定义。
5、处理长字符串有个更基本的方法:在一行的末尾加一反斜线符号可将此行和下一行当作同一行处理。
三、变量
明确一下左值与右值的概念:
左值:可以出现在赋值语句的左边或右边;
右值:只能出现在赋值的右边,不能出现在赋值语句的左边。
例,变量是左值,数字字面值是右值。
1、变量初始化
(1)C++支持两种变量初始化的方式:复制初始化和直接初始化。
int ival(1024); // direct-initialization
int ival = 1024; // copy-initialization
“初始化不是赋值”。初始化是指创建变量并给它赋初值,而赋值是擦除对象的当前值并用新值代替。
对于内置类型的对象,复制初始化和直接初始化几乎没有差别;对于类类型的对象,
有些初始化仅能用直接初始化完成。
(2)对于内置类型的变量,在函数体外定义的变量都初始化为0,在函数体内定义的变量,不进行自动初始化。
对于类类型的对象,其初始化是通过构造函数实现的。
(3)定义与声明
定义:用于为变量分配存储空间,还可以(不是必须)为变量指定初始值。在一个程序中(可能多个文件),
变量有且仅有一个定义。
声明:用于向程序表明变量的类型和名字。
有种观点认为,定义也是声明。因为当定义变量时,我们声明了它的类型和名字。个人认为,将声明和定义
完全区分开来,比较容易理解。
extern int i; //declares
int i; //defines
extern double pi = 3.1416; //definition
extern double pi; //ok: declaration not definition
double pi; //error: redefinition of pi
注意:变量必须且仅能定义一次,而且在使用变量前必须定义或声明!任何在多个文件中使用的变量
都需要有与定义分离的声明。在此情况下,一个文件中含有变量的定义,使用该变量的其他文件则
包含该变量的声明。
四、const限定符
(1)const变量定义时必须进行初始化,而且定义后不能通过重新赋值等方式被修改。
(2)const对象默认为文件的局部变量,此变量只存在于那个文件中,不能被其他文件访问。
除非:显式的指定它为extern。
五、引用// file_1.cc extern const int buf_size = fcn(); //file_2.cc extern const int buf_size; //uses buf_size defined in file_2
(1)引用是一种复合类型,通过在变量名前添加“&”符号来定义。每种引用类型都“关联到”
某一其他类型。
(2)引用必须用与该引用同类型的对象(不能是常量,必须是“对象”)进行初始化。引用在
定义时必须进行初始化。
(3)引用是变量的别名。当引用初始化后,只要该引用存在,就不能将此引用绑定到另一个对象。
(4)非const引用不能指向const对象。
const int ival = 1024; const int &ref_val = ival; //OK int &ref2 = ival; //error
(5)非const引用只能绑定到与该引用同类型的对象;const引用则可以绑定到不同但相关的类型
的对象或绑定到右值。
六、头文件// legal for const references only const int &r = 42; // double dval = 3.14; const int &ri = dval;
(1)头文件一般包含类的定义、extern变量的声明和函数的声明。
(2)因为头文件包含在多个源文件中,所以不应含有变量或函数的定义。
(3)对于头文件不应该包含定义这一规则,有三个例外。头文件可以定义类、值在编译时就
已知的const对象和inline函数。分别解释:
定义类。为了产生能定义或使用类的对象的代码,编译器需要知道组成该类型的数据成员。同样还
需知道能够在这些对象上执行的操作。
值在编译时就已知的const对象。用常量表达式进行初始化的const变量,其值在编译时就已知。
所谓常量表达式是指,编译器在编译时就能计算出结果的表达式。当我们在头文件中用常量表
达式定义了const变量后,每个包含该头文件的源文件都有了自己的const变量,其名称和值都一样。
若const变量不是用常量表达式初始化,那么它就不应该在头文件中定义。相反,和其他的变量
一样,该const变量应该在一个源文件中定义并初始化(注意定义时用extern显式声明)。然后在
头文件中为它添加extern声明。