本文主要介绍一下C++标准中关于类型的一些术语。如果文中有错误或遗漏之处,敬请指出,谢谢!
作者: 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限定的类型是不同的类型,但它们有相同的表示和对齐方式。
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。 |
如果文中有错误或遗漏之处,敬请指出,谢谢!
参考资料:
[1] C++标准文档:ISO/IEC 14882:1998