1、静态成员与类
A、静态成员属于类,而不是属于某个特定的对象,它是由该类的所有对象共享的,因此不能在类的构造方法中初始化
B,静态成员属于该类所有对象公有,可以被类对象调用
C,静态成员收private的限制
D,静态成员属于类和该类的所有对象,可以用类名直接调用
2、引用
引用为对象起了另外的一个名字,该对象是已经存在的对象,引用必须初始化,有类型
3、虚函数表、虚表指针
有虚函数的类,前四个字节是虚表指针,指向虚表。
class Test{ public: int a; int b; virtual void fun() {} Test(int temp1 = 0, int temp2 = 0) { a=temp1 ; b=temp2 ; } int getA() { return a; } int getB() { return b; } }; int main() { Test obj(5, 10); // Changing a and b int* pInt = (int*)&obj; *(pInt+0) = 100; *(pInt+1) = 200; cout << "a = " << obj.getA() << endl; cout << "b = " << obj.getB() << endl; return 0; }
代码输出:200 10
3、const
c++中,声明const int i,是在哪个阶段做到 i只可读的。
答案:编译阶段。
4、数组指针与二维数组
(一)int a[3][4],下面哪个不能表示 a[1][1]?
A、*(&a[0][0]+5)
B、*(*(a+1)+1)
C、*(&a[1]+1)
D、*(a[1]+1)
答案:C
解析:
在二维数组中a[1]表示的是a[1][0]的地址,数组在内存中连续存储,所以a[1]+1表示的是a[1][1]的地址,所以D可以取得正确的值;
指针操作*(a+1)与a[1]等价,所以B也可以取得正确的值;
二维数组在内存中是行优先存储的,所以A中a[0][0]的地址加5可以取得正确值;
C选项错误,应改为*(&a[1][0]+1),否则,则指向a[2][0]。
(二) 要使指针变量p指向2维数组A的第1个元素,正确的赋值表达式是()
p=A或p=A[0]
p=A[0]或p=A[0][0]
p=A[0]或p=&A[0][0]
p=A或p=&A[0][0]
答案:第三个选项
分析: A、p = A:在多维数组中,A表示第一维数组的地址,不是第一个元素的地址;
B、p = A[0]:在二维数组中,指向的是二维数组的第一个元素;
C、p = &A[0][0]:A[0][0]表示二维数组的第一个元素,所以可以p = &A[0][0]。
5、inline函数
因为内联函数是讲比较简单的代码嵌入到类中,避免调用函数产生额外的时间开销,一般用于加快程序执行速度。因为将代码嵌入到类中,所以可能导致可执行文件的变大或者变小。
6、new、malloc
a、都是在堆(heap)上进行动态的内存操作。
b、用malloc函数需要指定内存分配的字节数并且不能初始化对象,new 会自动调用对象的构造函数。
c、delete 会调用对象的destructor,而free 不会调用对象的destructor。
1) malloc 函数: void *malloc(unsigned int size)
在内存的动态分配区域中分配一个长度为size的连续空间。
如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化。
2)calloc 函数: void *calloc(unsigned int num, unsigned int size)
按照所给的数据个数和数据类型所占字节数,分配一个 num * size 连续的空间。
calloc申请内存空间后,会自动初始化内存空间为 0,但是malloc不会进行初始化,其内存空间存储的是一些随机数据。
3)realloc 函数: void *realloc(void *ptr, unsigned int size)
动态分配一个长度为size的内存空间,并把内存空间的首地址赋值给ptr,把ptr内存空间调整为size。
申请的内存空间不会进行初始化。
4)new是动态分配内存的运算符,自动计算需要分配的空间,在分配类类型的内存空间时,同时调用类的构造函数,对内存空间进行初始化,即完成类的初始化工作。动态分配内置类型是否自动初始化取决于变量定义的位置,在函数体外定义的变量都初始化为0,在函数体内定义的内置类型变量都不进行初始化。
7、C++对空类或者空结构体 ,对其sizeof操作时候,默认都是 1个字节
版权声明:本文为博主原创文章,未经博主允许不得转载。