C++中關于類型的一些術語
?本文主要介紹一下C++標準中關于類型的一些術語。如果文中有錯誤或遺漏之處,敬請指出,謝謝!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限定的類型是不同的類型,但它們有相同的表示和對齊方式。?? const類對象的非靜態、非mutable、以及非引用數據成員是const-qualified;
?? volatile類對象的非靜態、非引用數據成員是volatile-qualified;
?? const-volatile類對象的非靜態、非引用數據成員是const-volatile-qualified。?? 當CV-qualifiers用于限定數組類型時,實際上是數組成員被該CV-qualifiers限定,而非該數組類型。?? 復合類型并不因其成員被CV-qualifier限定而被該CV-qualifier限定,也就是說,即使復合類型的成員有CV-qualifier限定,該復合類型也不是CV-qualified對象。?? CV-qualifiers中的偏序關系:我們說A比B更多地被CV-qualifiers限定,記作B<A,這種關系如下所示:
???? no CV-qualiifer < const
?? no CV-qualifier < volatile
?? no CV-qualifier < const-volatile
???????? ??? const < const-volatile
??????? ? volatile < const-volatile
?? - incompletely-defind object type——非完整定義對象類型
?? 指那些只有聲明沒有定義的類,或者不知大小的數組,或者其元素是非完整類型的數組。 - incomplete types——非完整類型
?? 指非完整定義對象類型和void類型。例如:
class X;??????????? // X 是一個非完整類型
extern X* xp;?????? // xp是一個指向一個非完整類型的指針
extern int arr[];?? // arr的類型是非完整的
typedef int UNKA[]; // UNKA是一個非完整類型
UNKA* arrp;???????? // arrp是一個指向一個非完整類型的指針
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——對象類型
?? 非函數類型、非引用類型、非void類型的類型(可以被CV-qualifiers限定),叫對象類型。 - scalar type——標量類型(或純量類型)
?? 算術類型、枚舉類型、指針類型、成員指針類型(pointer to member types)、以及由CV-qulifiers限定的前面這些類型,都叫做標量類型。 - POD types(POD,Plain Old Data)——POD類型
?? 標量類型、POD-struct類型、POD-union類型、以及這些類型的數組或CV-qulifiers限定版本,統稱為POD類型。
?? 對于POD類型T的對象,不管這個對象是否擁有類型T的有效值,如果將該對象的底層字節序列拷貝到一個字符數組(或者無符號字符數組)中,再將其拷貝回對象,那么該對象的值與原始值一樣。例如:
??#define N sizeof(T)
char buf[N];
T obj;
memcpy(buf,&obj, N);
memcpy(&obj, buf, N); //此時obj的值與原始值相同
? 對于任意的POD類型T,如果兩個T指針分別指向兩個不同的對象obj1和obj2,如果用memcpy庫函數把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——靜態類型
?? 表達式的靜態類型是指不考慮程序的執行語義,而僅從程序分析所得到的結果類型。表達式的靜態類型只依賴于它所處的程序,在程序運行時不會改變。 - dynamic type——動態類型
?? 左值表達式的動態類型是指其在類的繼承關系中的最底層派生類(the most derived object)的類型;
?? 右值表達式的動態類型是它的靜態類型。例如,有如下代碼:
class B {};
class D: public B {};
class DD: public D {};
B* p;
p = new DD;
指針p的靜態類型是B*,而p實際上指向一個B的派生類D的對象,那么*p的動態類型就是DD。
?? 如果文中有錯誤或遺漏之處,敬請指出,謝謝!