算术类型(arithmetic type)
类型 | 含义 | 最小存储空间 |
bool | 布尔型 | - |
char | 字符型 | 8位 |
wchar_t | 宽字符型 | 16位 |
short | 短整型 | 16位 |
int | 整形型 | 16位 |
long | 长整型 | 32位 |
float | 单精度浮点型 | 6位有效数字 |
double | 双精度浮点型 | 10位有效数字 |
long double | 扩展精度浮点型 | 10位有效数字 |
- 整型(integral type)
表示整数、字符和布尔值的算术类型合称为整型(与浮点型相对应)。 - 字符型(char)
有三种类型:plain char, signed char, unsigned char,但只有两种表示方式:signed char和unsigned char。plain char用这两个表示方式之一来表示,至于用那种方式来表示取决于编译器,是实现定义的。
signed与unsigned类型
C++标准并没有定义signed类型如何用位来表示,编译器通常用其中一位作为符号位来表示。
对于unsigned 整型(unsigned char,unsigned short int, unsigned int, unsigned long int),编译器会将越界值对2^n取模(n为该类型的位数)使其满足大小要求。因此,unsigned整型在计算时不会发生溢出。
例如:(假设char类型为8位,2^8 = 256)
unsigned char ch = 300; 等价于 unsigned char ch = 44 (300 mod 256)
unsigned char ch = -1; 等价于 unsigned char ch = 255 (-1 mod 256)
字面值(literal, or literal constant)
- 如果它是十进制形式并且没有类型后缀,那么它的类型是下面第一个能表示它的类型:int、long int。
- 如果它是八进制或十六进制形式并且没有类型后缀,那么它的类型是下面第一个能表示它的类型:int,unsigned int,long int, unsigned long int。
- 如果它有类型后缀u或者U,那么它的类型是下面第一个能表示它的类型:unsigned int, unsigned long int。
- 如果它有类型后缀l或者L,那么它的类型是下面第一个能表示它的类型:long int, unsigned long int。
- 如果它有类型后缀ul,lu,uL,Lu,Ul,lU,UL或者LU,那么它的类型是unsigned long int。
如果一个字面值不能够被它所有可能类型所表示,那么将产生未定义行为。
不是以L开头的字符串字面值,叫作平凡字符串字面值(ordinary string literal),也叫作窄字符串字面值(narrow string literal)。对于平凡字符串字面值,其类型是const char[num],静态存储区,并用所给字符串初始化。
以L开头的字符串字面值,例如:L"foo",是宽字符串字面值。它的类型是const wchar_t[num],静态存储区,并用所给字符串初始化。
(注意上面的num值为所给字符串中字符个数 + 1)
变量及其类型
一些特殊的标识符为实现专用的保留标识符:
1)包含两个连续下划线的标识符以及以下划线开头紧跟一个大写字母的标识符。
2)在函数外定义的以下划线开头的标识符。
初始化有两种方式:
2)直接初始化(direct-initialization),例如:int var(6);
两种方式对于内置类型是没区别的,而对于类类型是有区别的,详见构造函数章节。
extern与const
|
在全局作用域内声明的const变量为内部连接属性,即是文件域变量,所以可以把const变量定义放在头文件中(如果这样做,那么在每个包含该头文件中的文件中都会有一个该变量的定义,这样可能造成存储空间的大量浪费。事实上,当const变量是用常量表达式初始化时,大部分编译器在编译时都会用相应的常量表达式替换这些const变量的任何使用。也就不会有空间用于这类const变量的存储)。
|
|
为什么const引用则可以绑定到不同但相关的类型的对象、甚至绑定到右值呢?
|
|
如果r不是const引用,那么可以修改r的值。这样做,事实上是修改了临时变量tmp的值,而与程序员试图修改var的值的意愿完全偏离。这种错误是很难察觉的。而const引用不能修改,就完全避免了这种错误的发生。
枚举类型
枚举类型的对象的初始化或赋值只能通过其枚举成员或同一枚举类型对象进行。
当需要整形常量时,用枚举类型(匿名枚举类型)代替#define预处理命令是一个不错的选择。
如果文中有错误或遗漏之处,敬请指出,谢谢!
参考资料:[1] C++ Primer(Edition 4)[2] International Standard:ISO/IEC 14882:1998