再学C++之C++中的全部关键字
/*______C++全部关键字___________*/ asm do if return try auto double inline short typedef bool dynamic_cast int signed typeid break else long sizeof typename case enum mutable static union catch explicit namespace static_cast unsigned char export new struct using class extern operator switch virtual const false private template void const_cast float protected this volatile continue for public throw wchar_t default friend register true while delete goto reinterpret_cast //C++操作代替名 and bitand compl not_eq or_eq xor_eq and_eq bitor not or xor
以上的关键字太多啦。 但是有些我们都已经很熟悉。 下面是一些不是太常见的关键字的用法:
1。 共用体(union)
struct widget{ char brand[20]; int type; union id { long id_num; char id_char[20]; }id_val; }; widget prize; if(prize.type==1) cin>>prize.id_val.id_num; else cin>>prize.id_val.id_char; //隐式共用体 struct widget{ char barnd[20]; int type; union { long id_num; char id_char[20]; }; }; widget prize; if(prize.type==1) cin>>prize.id_num; else cin>>prize.id_char; //摘自C++ primer plus。P95
共用体常用于(但并非只能用于)节省内存。 另外, 共用体常用于操作系统数据结构或硬件数据结构。
2. 枚举(enum)
enum spectrum{red, orange, yellow, green, bule, violet, indigo, ultraviolet}; band = blue; //valid, blue is an enumerator. band = 2000; //invalid. //枚举类型仅仅定义了赋值运算符。 int color = bule; //类型转换。 band = 2 ; // invalid, int not converted to spectrum color = 3 + red //valid, red convertrd to int //省略枚举变量的名称。 enum{red, orange, yellow, green, bule, violet, indigo, ultraviolet}; //设置枚举变量的值。 enum bits{one=1, two=2, four=4, eight=8}; enum bigstep{first, second =100, third}; //详见: C++ primer plus 。P97
枚举类型的限制很多,想深入了解, 请看相关的书籍。
3.类型别名 typedef 与 #define , 这两个东东大家都很常用, 我就说一句, 用typedef声明类型别名适用的范围比#define 声明的大些, 你看着办吧!
4. const限定符
用以限定定义后的变量, 即,定义后不再允许修改变量的值。 const double IP = 3.14
(默认状态下, const对象仅在文件内有效!)
初始化和对const的引用:
引用的类型必须与其引用对象的类型一致,但是有两个例外。 第一种情况是初始化常量时允许任意表达式作为初始值,只要该表达式的结果能转化成引用类型即可(可能要通过强制类型转换)。允许为一个常量引用绑定非常量的对象,字面值,甚至是一个表达式。
int i=42; const int &r1 = i; //允许将const int&绑定到一个普通的int对象int对象上 const int &r2 = 42;//正确: r1是一个常量引用 const int &r3 = r1*2;//正确:r3是一个常量引用 int &r4=r1*2; //错误:r4是一个普通的非常量引用
要想理解这种例外情况的原因,最简单的方法是弄清楚当一个变量引用被绑定到另外一种对象类型上时到底发生了什么:
double dval = 3.14;
const int &ri = dval;
此处ri引用了一个int型的数, 对ri的操作应该是整数运算,但dval却是一个双精度浮点数而非整数。因此为了确保让ri绑定一个整数,编译器把上述代码变成了如下形式:
const int temp = dval; //由双精度浮点数生成一个临时的整型变量。
const int &ri = temp; //让ri绑定这个临时量。
所谓的临时量对象就是当编译器需要一个空间来暂存表达式的求值结果时临时创建的一个未命名对象。C++程序员们常把临时变量对象简称为临时量
拓展: 指针与const
指向常量的指针(ponter to const)不能用于改变其所指对象的值。要想存放常量对象的地址,只能使用指向常量的指针。
const double pi = 3.14;//pi是个常量,它的值不能改变 double *ptr = &pi//错误:ptr是一个普通指针 const double *cptr = &pi//正确 *cptr = 42; //错误: 不能给*cptr赋值.
const 指针:
指针和其他的对象类型一样,允许把指针本身定为常量。 常量指针(const pointer)必须初始化,而且一旦初始化完成则它的值(也就是存放在指针中的那个地址)就不能再改变啦。 把*放在const关键字之前用以说明指针是一个常量,这样的书写形式隐含着一种意味,即:不变的是指针本身的值而非指向的那个值。
int errNumb = 0; int *const curErr = &errNumb;//curErr将一直指向errNumb const double pi = 3.14159; const double *const pip = π//pip是一个指向常量对象的常量指针
constexpr变量:
声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。
constexpr int mf = 20; //20是常量表达式 constexpr int limit = mf+1; //mf+1是量表达式 constexpr int sz = size(); //只有当size是一个 //constexpr函数时,才是一条正确的声明语句
尽管不能使用普通函数作为constexpr变量的初始值, 但是新标准允许定义一种特殊的constexpr函数。 这种函数应该足够简单以使得编译时就可以计算其结果,这样就能用constexpr函数去初始化constexpr变量啦。
一般来说,如果你认定一个变量是常量表达式,那就把它声明成constexpr类型。