文章出處

/*______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類型。

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()