再学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)this

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 

枚举类型的限制不少,想深刻了解, 请看相关的书籍。spa

 

3.类型别名 typedef 与 #define , 这两个东东你们都很经常使用, 我就说一句, 用typedef声明类型别名适用的范围比#define 声明的大些, 你看着办吧!操作系统

 

 4. const限定符指针

用以限定定义后的变量, 即,定义后再也不容许修改变量的值。 const double IP = 3.14code

(默认状态下, const对象仅在文件内有效!)对象

初始化和对const的引用:blog

引用的类型必须与其引用对象的类型一致,可是有两个例外。 第一种状况是初始化常量时容许任意表达式做为初始值,只要该表达式的结果能转化成引用类型便可(可能要经过强制类型转换)。容许为一个常量引用绑定很是量的对象,字面值,甚至是一个表达式。

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类型。

相关文章
相关标签/搜索