-
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。
相关文章
- 11-25关于golang中go mod的使用,以及自己的一些心得
- 11-25Python中,关于调用带参函数,一些需要注意的问题(监听时)
- 11-25c++ 类覆盖方法中的协变返回类型
- 11-25C++ 中关于 输出的重定向
- 11-25关于CCS中的一些C语法学习
- 11-25关系抽取任务中的一些术语
- 11-25工作中关于this指向的一些问题
- 11-25关于Maven中
产生的一些问题 - 11-25c++中4个与类型转换相关的关键字分析
- 11-25前端面试中关于HTML和CSS的一些基础题笔记整理