C++中关于类型的一些术语

  1. 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

      
  2. incompletely-defind object type——非完整定义对象类型
       指那些只有声明没有定义的类,或者不知大小的数组,或者其元素是非完整类型的数组。
  3. 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
    }



  4. object type——对象类型
       非函数类型、非引用类型、非void类型的类型(可以被CV-qualifiers限定),叫对象类型。

  5. scalar type——标量类型(或纯量类型)
       算术类型、枚举类型、指针类型、成员指针类型(pointer to member types)、以及由CV-qulifiers限定的前面这些类型,都叫做标量类型。

  6. 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



  7. static type——静态类型
       表达式的静态类型是指不考虑程序的执行语义,而仅从程序分析所得到的结果类型。表达式的静态类型只依赖于它所处的程序,在程序运行时不会改变。

  8. 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。


上一篇:【译】在Asp.Net中操作PDF – iTextSharp - 使用表格


下一篇:DRF如何序列化外键的字段