標籤: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 筆記——固有的不可移植的特性