C++ Primer 筆記——固有的不可移植的特性

來源:互聯網
上載者:User

標籤:c++ prime   筆記   primer   位域   返回   ons   種類   ++   依賴   

1.為了支援底層編程,C++定義了一些固有的不可移植的特性,所謂不可移植特性是指因機器而異的特性。

 

2.一個位域中含有一定數量的二進位位,位域在記憶體中的布局是機器相關的。位域的類型必須是整型或枚舉類型,因為帶符號位位域的行為是由具體實現確定的,所以在通常情況下我們使用無符號類型儲存一個位域。

typedef unsigned int Bit;class test{    Bit A : 2;    // A佔2位    Bit B : 1;    // B佔1位    Bit C : 3;    // C佔3位};

如果可能的話,在類的內部連續定義的位域壓縮在同一整數的相鄰位,從而提供儲存壓縮。這些是與機器相關的。

3.取地址運算子不能作用於位域,因此任何指標都無法指向類的位域。

 

4.訪問位域的方式:

typedef unsigned int Bit;class test{public:    Bit A : 2;    // A佔2位    Bit B : 1;    // B佔1位    Bit C : 3;    // C佔3位};test t;t.A |= 0xFF;    // A=3t.B = 1;        // B=1t.C &= 0x00;    // C=0


 

5.volatile表示對象的值可能在程式的控制或檢測之外被改變,並告訴編譯器不應該對這樣的對象進行最佳化。voilatile起到對類型額外修飾的作用。

class test{};volatile int i;            // 該int值可能發生改變volatile int* p;        // p指向一個volatile對象volatile int arr[2];    // arr的每個元素都是volatilevolatile test t;        // t的每個成員都是volatile

 

6.const和volatile限定符互相沒什麼影響,某種類型可能既是const的也是volatile的,此時它同時具有二者的屬性。

 

7.就像一個類可以定義const成員函數一樣,它也可以將成員函數定義成volatile的,只有volatile的成員函數才能被volatile的對象調用。

 

8.和const一樣,我們只能將一個volatile對象的地址賦值給一個指向volatile的指標,只有當某個引用是volatile的時,我們才能使用一個volatile對象初始化該引用。

volatile int i;                // i是一個volatile intint *volatile ip;            // ip是一個volatile指標,指向intvolatile int* p;            // p是一個指標,指向volatile intvolatile int *volatile vp;    // vp是一個volatile指標,它指向一個volatile intint *p1 = &i;    // 錯誤,必須使用只想volatile的指標p = &i;            // 正確vp = &v;        // 正確


9.const和volatile的一個重要區別是我們不能使用合成的拷貝/移動建構函式及賦值運算子初始化volatile對象或從volatile對象賦值。因為合成的成員接受的形參是非volatile常量引用,顯然我們不能把一個非volatile引用綁定到一個volatile對象上。

 

10.C++ 使用連結指示指出任意非C++函數所用的語言。想要把C++代碼和其他語言編寫的代碼放在一起使用,要求我們必須有權訪問該語言的編譯器,並且這個編譯器與當前的C++編譯器是相容的。

 

11.連結指示不能出現在類定義或函數定義的內部。同樣的連結指示必須在函數的每個聲明中都出現。

extern "C" size_t strlen(const char*);    // 單語句連結指示extern "C"    // 複合陳述式連結指示{    int strcmp(const char&, const char*);    char *strcat(char*, const char*);}


12.多重聲明的形式可以應用於整個標頭檔。標頭檔中所有普通函式宣告都被認為是由連結指示的語言編寫的,連結指示可以嵌套,因此如果標頭檔包含內建連結指示的函數,則該函數的連結不受影響。

extern "C"    {    #include <string.h>}


13.當我們使用連結指示時,它不僅對函數有效,而且對作為傳回型別或形參類型的函數指標也有效。

// func是一個C函數,它的形參是一個指向C函數的指標extern "C"    void func(void(*)(int));


14.因為連結指示同時作用於聲明語句中的所有函數,所以如果我們希望給C++傳入一個指向C函數的指標,則必須使用類型別別名。

extern "C"    typedef void func(int);void f(func *);


15.通過使用連結指示對函數進行定義,我們可以令一個C++函數在其它語言編寫的程式中可用。但是要注意類型限制。

extern "C"    int add(int) {}        // add 函數可以被C程式調用


16.有時候需要在C和C++中編譯同一個源檔案,我們可以使用預先處理定義__cplusplus。

#ifdef __cplusplusextern "C"#endifint strcmp(const char*, const char*);


17.連結指示與重載函數的相互作用依賴於目標語言。如果目標語言支援重載函數,則為該語言實現連結指示的編譯器很可能也支援重載這些C++的函數。如果在一組重載函數中有一個是C函數,則其餘的必定都是C++函數。

 

C++ Primer 筆記——固有的不可移植的特性

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.