?本文主要介紹一下C++標(biāo)準(zhǔn)中關(guān)于類型的一些術(shù)語(yǔ)。如果文中有錯(cuò)誤或遺漏之處,敬請(qǐng)指出,謝謝!
?? 作者: tyc611, 2007-01-10?
From:http://blog.chinaunix.net/u/18517/showart_229492.html
CV-qualifiers(CV限定符)
?? CV-qualifiers有三種:const-qualifier(const限定符)、volatile-qualifier(volatile限定符)、以及const-volatile-qualifier(const-volatile限定符)。
?? 用CV-qulifiers限定和未被CV-qulifiers限定的類型是不同的類型,但它們有相同的表示和對(duì)齊方式。
?? const類對(duì)象的非靜態(tài)、非mutable、以及非引用數(shù)據(jù)成員是const-qualified;
?? volatile類對(duì)象的非靜態(tài)、非引用數(shù)據(jù)成員是volatile-qualified;
?? const-volatile類對(duì)象的非靜態(tài)、非引用數(shù)據(jù)成員是const-volatile-qualified。
?? 當(dāng)CV-qualifiers用于限定數(shù)組類型時(shí),實(shí)際上是數(shù)組成員被該CV-qualifiers限定,而非該數(shù)組類型。
?? 復(fù)合類型并不因其成員被CV-qualifier限定而被該CV-qualifier限定,也就是說(shuō),即使復(fù)合類型的成員有CV-qualifier限定,該復(fù)合類型也不是CV-qualified對(duì)象。
?? CV-qualifiers中的偏序關(guān)系:我們說(shuō)A比B更多地被CV-qualifiers限定,記作B<A,這種關(guān)系如下所示:
??
?? no CV-qualiifer < const ?? no CV-qualifier < volatile ?? no CV-qualifier < const-volatile ???????? ??? const < const-volatile ??????? ? volatile < const-volatile |
??
incompletely-defind object type——非完整定義對(duì)象類型
?? 指那些只有聲明沒(méi)有定義的類,或者不知大小的數(shù)組,或者其元素是非完整類型的數(shù)組。
- incomplete types——非完整類型
?? 指非完整定義對(duì)象類型和void類型。
例如: class X;??????????? // X 是一個(gè)非完整類型 extern X* xp;?????? // xp是一個(gè)指向一個(gè)非完整類型的指針 extern int arr[];?? // arr的類型是非完整的 typedef int UNKA[]; // UNKA是一個(gè)非完整類型 UNKA* arrp;???????? // arrp是一個(gè)指向一個(gè)非完整類型的指針
void foo() { ?? xp++;?????? // ill-formed: X is incomplete ?? arrp++;???? // ill-formed:?incomplete type }
struct X { int i; }; // now X is a complete type int arr[10];???????? // now the type of arr is complete X x;
void bar() { ?? xp = &x;?????? // OK:type is “pointer to X” ?? arrp = &arr;?? // ill-formed:?different types ?? xp++;????????? // OK: X is complete ?? arrp++;??????? // ill-formed:?UNKA can’t be completed } |
- object type——對(duì)象類型
?? 非函數(shù)類型、非引用類型、非void類型的類型(可以被CV-qualifiers限定),叫對(duì)象類型。
- scalar type——標(biāo)量類型(或純量類型)
?? 算術(shù)類型、枚舉類型、指針類型、成員指針類型(pointer to member types)、以及由CV-qulifiers限定的前面這些類型,都叫做標(biāo)量類型。
- POD types(POD,Plain Old Data)——POD類型
?? 標(biāo)量類型、POD-struct類型、POD-union類型、以及這些類型的數(shù)組或CV-qulifiers限定版本,統(tǒng)稱為POD類型。
?? 對(duì)于POD類型T的對(duì)象,不管這個(gè)對(duì)象是否擁有類型T的有效值,如果將該對(duì)象的底層字節(jié)序列拷貝到一個(gè)字符數(shù)組(或者無(wú)符號(hào)字符數(shù)組)中,再將其拷貝回對(duì)象,那么該對(duì)象的值與原始值一樣。例如:
??
#define N sizeof(T) char buf[N]; T obj; memcpy(buf,&obj, N); memcpy(&obj, buf, N); //此時(shí)obj的值與原始值相同
|
? 對(duì)于任意的POD類型T,如果兩個(gè)T指針?lè)謩e指向兩個(gè)不同的對(duì)象obj1和obj2,如果用memcpy庫(kù)函數(shù)把obj1的值拷貝到obj2,那么obj2將擁有與obj1相同的值。例如:
?
T* p1; T* p2;?? // provided that p1 points to an initialized object
memcpy(p2, p1,sizeof(T));// at this point, every subobject of POD type
?????????????????????????? // in *p2 contains?the same value as the
???????????????????????????// corresponding subobject in *p1
|
- static type——靜態(tài)類型
?? 表達(dá)式的靜態(tài)類型是指不考慮程序的執(zhí)行語(yǔ)義,而僅從程序分析所得到的結(jié)果類型。表達(dá)式的靜態(tài)類型只依賴于它所處的程序,在程序運(yùn)行時(shí)不會(huì)改變。
- dynamic type——?jiǎng)討B(tài)類型
?? 左值表達(dá)式的動(dòng)態(tài)類型是指其在類的繼承關(guān)系中的最底層派生類(the most derived object)的類型;
?? 右值表達(dá)式的動(dòng)態(tài)類型是它的靜態(tài)類型。
例如,有如下代碼: class B {}; class D: public B {}; class DD: public D {};
B* p; p = new DD;
指針p的靜態(tài)類型是B*,而p實(shí)際上指向一個(gè)B的派生類D的對(duì)象,那么*p的動(dòng)態(tài)類型就是DD。 |
?? 如果文中有錯(cuò)誤或遺漏之處,敬請(qǐng)指出,謝謝!
參考資料:
[1] C++標(biāo)準(zhǔn)文檔:ISO/IEC 14882:1998