第二章 、变量和基本类型
2.1、基本内置类型
1、整形包括整数、字符和布尔值;字符类型有两种: char 和 wchar_t , char 类型通常是 1 字节 (8 位 ) , wchar_t 类型用于扩展字符集 ( 日语、中文 ) 。
2、 unsigned int 可以简单表示为 unsigned 。
3、在 C++ 中,将负值赋给 unsigned 对象是合法的,其结果是该负数对该类型的取值个数求模后的值。如把 -1 赋给 8 位的 unsigned char ,其结果是 255 。
4、 C++ 内置数据类型:
C++ |
char |
8位 |
|
JAVA |
byte |
8位 |
|
Wchar_t |
16位 |
|
|
short |
16位 |
|
short |
16位 |
|
|
int |
32位 |
|
int |
16位 |
|
|
long |
64位 |
|
long |
32位 |
|
|
Float(0.0f) |
32位 |
|
float |
32位 |
|
|
Double(0.0) |
64位 |
|
double |
64位 |
|
|
char |
16位 |
|
Long double |
96或 128 位 |
|
|
|
|
在实际应用中,C++ 中的 int 、 long 常为 32 位、 64 位。
5、内置类型变量是否自动初始化取决于变量定义的位置: 在函数体外定义的变量都初始化为0 ,在函数体内定义的变量则不进行初始化。
2.2、字面值常量
1、 只有内置类型存在字面值,没有类类型的字面值;
2、 没有short 类型的字面值常量;
3、 默认的浮点字面值常量为double 类型;
4、 宽字符字面值是在字符前面加上大写字母L ,如 L'a' 。
5、 在C++ 中,所有的 字符串的字面值 均有编译器在末尾加一个空格符('/0') ;在一行的末尾加一个反斜线可将本行于下一行当做同一行处理。注意:反斜线符号必须是该行的尾字符,不允许其后面有注释或空格;后继行行首的任何空格符和制表符均是字符串值的一部分。
6、字符串字面值的类型是const char 类型的数组 。
2.3、变量 (CONST 的应用 )
1、 声明 用于向程序声明变量的类型和名字; 定义 用于为变量分配存储空间,还可以为变量指定初始值。 定义也是声明 :当定义变量时我们声明了它的类型和名字。可以通过使用 extern 关键字声明变量名而不定义它,如extern int i 只是声明而没有定义,而 int i 是定义同时也是声明; extern 声明不是定义,不分配存储空间。 在程序中变量可以声明多次,但只能被定义一次。
2、只有当声明也是定义时,声明才可以初始化,因为只有定义才分配存储空间。如果声明有初始化式,那么它可以被当做是定义,即使声明标记为 extern :如 extern double pi=3.1415926 ; 只有当extern 声明位于函数外部时,才可以被初始化,含有初始化式。
3、任何在多个文件中使用的变量都需要有与定义分离的声明。一般,一个文件含有变量的定义,使用该变量的文件中则包含它的声明。
4、 const 和数据类型结合在一起,形成所谓的“常类型”,然后利用常类型来定义或声明变量。 Const 用来修饰类型时,既可以放在类型的前面,也可以放在类型的后面;用常类型来声明或定义变量时, const 只会出现在变量前面。 Const 与被修饰的类型之间不能有其他标识符存在。
5、对于一个具体的变量来说,如果 const 直接出现在该变量的前面,则该变量的值一旦被初始化就不能改变。
6、可以把一个非 const 变量定义在一个文件中,假设已经做了合适的声明,就可以在另外的文件中使用这个变量:
//file_1.c
int counter; //定义变量 counter
//file_2.c
extern int counter; //使用文件 1 中的 counter 变量
++counter;
7、 与其他变量不同,除非特别说明, 在全局作用域声明的const 变量是定义该对象的文件的局部变量,此变量只存在于那个文件中,不能被其他文件访问。 通过指定const 变量为 extern 就可以在别的文件中访问该 const 对象。另外,非 const 变量默认为 extern ,要使 const 变量能在其他文件中访问,必须显示地指定为 extern 。
//file_1.c
//定义变量可以在其他文件中访问的变量 counter
extern const int counter = fcn();
//file_2.c
extern const int counter; //使用文件 1 中的 counter 变量
++counter;
8、 常对象:用const 修饰的对象成为常对象;通过常对象只能调用该对象的常函数。
9、 常指针:const 在修饰指针时,由于 const 的位置不同而含义不同。例如:
(1)、 char * const prt1 = stringprt1;其中 prt1 是一个 常量指针 , const
修饰的是指针 。操作prt1 = stringprt2; 非法,而 *prt1 = "m"; 合法。
这是因为 指针prt1 所指向的变量可以更新,而常量指针 prt1 所指向的方
向是不可更新的;也就是说,prt1 只能指向 stringprt1 ,不能指向其他
的字符串,但stringprt1 的只可以改变。
(2)、 char const * prt2 = stringprt2; prt2是一个指向字符串常量的指
针,const 修饰字符串 。此时, prt2所指向的字符串不可改变,但是 prt2
所指向的对象可以改变 。*prt2="x"; 非法,但 prt2=stringprt2; 合法。
10、 const int & SetPoint(const int& param) const
第一个const :函数的返回值限定为 const ,即返回值不能被修改。 const int a =
SetPoint(b);a的值在此后不能被修改。
第二个const :指函数的形参为 const 类型,函数体内不能被修改。
第三个const : const 用来修饰成员函数,该函数为 常函数 ,表明这个函数不会对这个类
对象的数据成员( 准确的说是非静态数据成员 )做任何修改。
11、 const_cast是一种 C++ 运算符,作用是去除复合类型中的 const 或者 volatile 属性,其语法形式是: const_cast<type>(expression) ,其中 expression 外面的括号不能省略。如:
const int a = 4; int &r = const_cast<int &>(a);
12、 通过const_cast 操作符,只能将 const type* 类型转换成 type* 类型,或者将 const type& 类型转换成 type& 类型 。即源类型与目标类型除了const 属性以外,其他方面必须相同。 const int A[]={1,2,4}; char* p=const_cast<char *>(A); 是非法的。
2.4、引用以及其他类型
1、 C++ 中的引用 ( 引用的简单介绍,具体应用参见第七章 ) :
(1) 、引用是一种 复合类型( 用其他类型定义的类型 ) ,通过在变量名之前加"&" 符号来定义,但不可以定义引用类型的引用;
(2) 、引用只是它绑定对象的另一个名字, 作用在引用上的所有操作事实上都是作用在该引用绑定的对象上 ;
(3) 、引用必须用与该引用类型同类型的 对象 初始化;当引用初始化后,只要该引用存在,它就保持绑定到初始化时指向的对象, 不可能将引用绑定到另一个对象 。
int value = 1024;
int &refValue1 = value; //合法
Int &refValue2; //非法, 引用在声明时必须被初始化
int &refValue3 = 10; //非法, 初始化必须用对象
(4) 、const 引用:指向 const 对象的引用。
const int value = 1024;
const int &refValue = value; //合法
int &refValue2 = value; //非法,非 const 引用指向 const 对象
非const 引用只能绑定到与该引用同类型的对象,但是 const引用可以绑定到不同但相关类型的对象或绑定到右值 。
int i = 42;
//以下的定义只对 const 引用合法
const int &ref = 42;
const int &ref2 = r + i;
2、 typedef 用来定义类型的同义词,用法: typedef double wages;
typedef通常被用于以下三种目的:
(1) 、为了隐藏特定类型的实现,强调使用类型的目的;
(2) 、简化复杂的类型定义,使其更易理解;
(3) 、允许一种类型用于多个目的,同时使得每次使用该类型的目的明确。
3、枚举: enum open_modes {input, output, append};
(1) 、第一个枚举成员默认值为0 ;
(2) 、可以为枚举成员提供初始值,但必须是一个 常量表达式( 编译器在编译时就能计算出结果的整形表达式 ) 。
(3) 、枚举成员值可以不唯一:enum Points { point2d = 2, point2w,
point3d = 3, point3w };
(4) 、每个enum 都定义了一种唯一的类型,可以定义和初始化,但 枚举类型的对象的初始化或赋值只能通过其枚举成员或同一枚举类型的其他对象来进行 。
2.5、头文件
1、头文件用于声明而非定义,对于头文件不应该含有定义这一规则,有三个例外: 头文件可以定义类、值在编译时就已知的const 对象和 inline 函数 。但是如果const 对象不是用常量表达式初始化,那么它就不应该在头文件中定义。
2、预处理器变量:预处理器变量有 已定义 和 未定义 两种状态。#define 指示接受一个名字并定义该名字的预处理器变量; #ifndef 指示检测指定的预处理器变量是否未定义,如果预处理器变量未定义,那么跟在其后的所有指示都被处理,直到遇到 #endif 。
可以使用这些设施来预防多次包含同一个头文件:
#ifndef SALESITEM_H
#define SALESITEM_H
//定义 Sales_item 类
#endif
(未完待续)