再學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類型。

相關文章
相關標籤/搜索