1.为了支持底层编程,C++定义了一些固有的不可移植的特性,所谓不可移植特性是指因机器而异的特性。
2.一个位域中含有一定数量的二进制位,位域在内存中的布局是机器相关的。位域的类型必须是整型或枚举类型,因为带符号位位域的行为是由具体实现确定的,所以在通常情况下我们使用无符号类型保存一个位域。
typedef unsigned int Bit;class test{ Bit A : 2; // A占2位 Bit B : 1; // B占1位 Bit C : 3; // C占3位};
如果可能的话,在类的内部连续定义的位域压缩在同一整数的相邻位,从而提供存储压缩。这些是与机器相关的。
3.取地址运算符不能作用于位域,因此任何指针都无法指向类的位域。
4.访问位域的方式:
typedef unsigned int Bit;class test{public: Bit A : 2; // A占2位 Bit B : 1; // B占1位 Bit C : 3; // C占3位};test t;t.A |= 0xFF; // A=3t.B = 1; // B=1t.C &= 0x00; // C=0
5.volatile表示对象的值可能在程序的控制或检测之外被改变,并告诉编译器不应该对这样的对象进行优化。voilatile起到对类型额外修饰的作用。
class test{};volatile int i; // 该int值可能发生改变volatile int* p; // p指向一个volatile对象volatile int arr[2]; // arr的每个元素都是volatilevolatile test t; // t的每个成员都是volatile
6.const和volatile限定符互相没什么影响,某种类型可能既是const的也是volatile的,此时它同时具有二者的属性。
7.就像一个类可以定义const成员函数一样,它也可以将成员函数定义成volatile的,只有volatile的成员函数才能被volatile的对象调用。
8.和const一样,我们只能将一个volatile对象的地址赋值给一个指向volatile的指针,只有当某个引用是volatile的时,我们才能使用一个volatile对象初始化该引用。
volatile int i; // i是一个volatile intint *volatile ip; // ip是一个volatile指针,指向intvolatile int* p; // p是一个指针,指向volatile intvolatile int *volatile vp; // vp是一个volatile指针,它指向一个volatile intint *p1 = &i; // 错误,必须使用只想volatile的指针p = &i; // 正确vp = &v; // 正确
10.C++ 使用链接指示指出任意非C++函数所用的语言。想要把C++代码和其他语言编写的代码放在一起使用,要求我们必须有权访问该语言的编译器,并且这个编译器与当前的C++编译器是兼容的。
11.链接指示不能出现在类定义或函数定义的内部。同样的链接指示必须在函数的每个声明中都出现。
extern "C" size_t strlen(const char*); // 单语句链接指示extern "C" // 复合语句链接指示{ int strcmp(const char&, const char*); char *strcat(char*, const char*);}
extern "C" { #include}
// func是一个C函数,它的形参是一个指向C函数的指针extern "C" void func(void(*)(int));
extern "C" typedef void func(int);void f(func *);
extern "C" int add(int) {} // add 函数可以被C程序调用
#ifdef __cplusplusextern "C"#endifint strcmp(const char*, const char*);