C++类型和声明

来源:互联网 发布:淘宝7了个3 编辑:程序博客网 时间:2024/05/01 14:45
枚举和类被称为用户定义类型,他们必须由用户定义出来,而不能事先没有声明就直接使用,例如在使用CMyclass a之前必须定义CMyclass类型。
内部类型可以直接使用,例如可以直接这样int a。

按照定义,true具有值1,而false具有值0。与此相对应,整数可以隐式地转换到bool值:非0的整数转换为true,而0转换为false。
举例:int a = 10; bool b = a; int c = b; 结果a为10,b为true,c为1。
指针也可以隐式地转换到bool,非0指针转为true,具有0值的指针转换为false。

由0开头后跟x(0x)的文字量是十六进制数(以16作为数的基数),以0开头的文字量后面没有x的是八进制数(以8为基数)。
例如:
decimal:     0   2   63   83
ocatl:       0   02  077  0123
hexadecimal: 0x0 0x2 0x3f 0x53

后缀U可以用于显示地写出unsigned文字量,后缀L可用于显示地写出long文字量。例如,3是一个int类型,3U是一个unsigned int类型,3L是一个long int类型。

浮点类型表示浮点数,浮点数有三种大小:float(单精度),double(双精度),long double(扩展精度)。按默认规定,浮点文字量的类型是double,浮点文字量的中间不能出现空格(123.4 56将引起语法错误)。如果需要写类型为float的浮点文字量,可以通过后缀f或F定义,例如;1.23f;如果需要类型为long double的浮点文字量,可以通过后缀l或L定义它们,例如3.12L

下面是基本类型的大小所能保证的性质:
1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
1 <= sizeof(bool) <= sizeof(long)
sizeof(float) <= sizeof(double) <= sizeof(long double)
sizeof(N) == sizeof(signed N) == sizeof(unsigned N)
其中N可以是char,short int,int或long int。此外,这里还保证char至少有8位,short至少有16位,long至少有32位

类型void是一个语法上的基本类型。它可以作为更复杂的类型中的组成部分,但是没有类型为void的对象。void被用于刻画一个函数并不返回值,它还被用做指向不明类型的对象的指针的基础类型。例如:
void x;  //错误,没有void对象
void f(); //函数f不返回值
void* pv; //指向类型不明的对象的指针

按默认方式,枚举所赋的值从0开始递增。枚举符也可以用整型进行初始化,如果某个枚举中所有枚举符的值均非负,该枚举的表示范围就是[0 : 2^k-1],其中2^k是能使所有枚举符位于此范围内的最小的2的幂;如果存在负的枚举符值,该枚举的取值范围就是[-2^k : 2^k-1]。例如:
enum e1{dark, light}; //范围0 : 1
enum e2{a = 3, b = 9}; //范围0 : 15
enum e3{min = -10, max = 1000000}; //范围-1048576 : 1048575
一个整型值可以显示地转换到一个枚举值,除非这种转换的结果位于该枚举的范围内,否则就是无定义的。例如:
enum flag{x=1, y=2, z=4, e=8};
flag f1 = 5; //类型错,5不是flag类型
flag f2 = flag(5); //可以,flag(5)是flag类型且在flag的范围之内
flag f3 = flag(z|e); //可以, flag(12)是flag类型且在flag的范围之内
flag f4= flag(99); //无定义,99不在flag的范围之内
一个枚举的sizeof就是某个能够容纳其范围的整型的sizeof,而且不会大于sizeof(int),除非有某个枚举符的值不能用int也不能用unsigned int表示。举例来说,在sizeof(int) == 4的机器上,sizeof(el)可以是1,也可能是4,但绝不会是8

运算符只作用于一个单独的名字,而不是同一个声明中随后写的所有名字。例如:
int* p, y; //int* p; int y;不是int* y;
int x, *q; //int x; int* q;
int v[10], *pv; //int v[10]; int* pv;
这种结构不利于阅读程序,因此应该避免

一个名字(标识符)由一系列字母和数字构成,其中第一个字符必须是字母。下划线字符也作为字母看待。

在一个块里声明的名字可以遮蔽在其外围的块里所声明的名字或者全局的名字。例如
int x //全局的
void f()
{
    int x; //局部的x遮蔽了全局的x
    x = 1; //给局部的x赋值
    {
        int x; //遮蔽第一个局部的x
        x = 2; //给第二个局部的x赋值
    }
    x = 3; //给第一个局部的x赋值
}
int* p = &x; //取全局x的地址
被遮蔽的全局名字可以通过作用域解析运算符::去引用,例如:
int x;
void f2()
{
    int x = 1; //遮蔽全局的x
    ::x = 2; //给全局的x赋值
    x = 2; //给局部的x赋值
}
int x = x;//这样做并不非法,只是荒谬。

函数参数被当做在函数最外层的块中声明的名字,所以
void f5(int x)
{
    int x; //错误
}
是错误的,因为x在同一个作用域里定义了两次。

如果为一个对象提供了初始式,这个初始式将确定对象的初始值。如果没有提供初始式,全局的,名字空间的和局部静态的对象将被自动初始化为适当类型的0,局部对象和在自由存储区里建立的对象将不会做初始化。数组和结构的成员,也根据数组或结构是否为静态来确定是否默认地进行初始化