1.下面代码的输出是什么?
class A
{
public:
A() { }
~A() { cout<<"~A"<<endl; }
};
class B:public A
{
public:
B(A &a):_a(a)
{
}
~B()
{
cout<<"~B"<<endl;
}
private:
A _a;
};
int main(void)
{
A a; //很简单,定义a的时候调用了一次构造函数
B b(a);
}
A.~B
B.~B ~A
C.~B ~A ~A
D.~B ~A ~A ~A
要想搞明白该问题,需要理解基类构造析构函数、子类构造析构函数和子类成员变量构造析构函数的调用顺序。
对于构造函数:基类构造函数 > 子类成员变量构造函数 > 子类构造函数
对于析构函数:子类析构函数 > 子类成员变量析构函数 > 基类析构函数
可以看出构造函数的调用过程和析构函数的调用过程正好相反。
main函数中首先构造变量a,然后是b。在构造b时首先调用b的基类A的构造函数,然后调用b中成员变量_a的构造函数,最后调用b的构造函数。
main函数调用结束返回时,变量的释放顺序跟变量的构造顺序正好相反。首先释放变量b,然后是变量a。
在释放变量b时,首先调用b的析构函数,然后析构变量b的成员_a,析构_a时调用_a的析构函数。再调用b的基类的析构函数。
然后是释放变量a,调用a的析构函数。
本例子中应该将A的析构函数更改为virtual的,防止使用多态机制时出现子类对象无法释放的情况,本例子中没有用到多态机制,不存在该问题。
最开始析构b,~B,这个是没有争议的。
接着是析构b的成员变量_a,所以是~A
接着是b的parent class(基类)的~A
最后才是a的析构~A
选D
2.下面有关malloc和new,说法错误的是?
A.new 建立的是一个对象, malloc分配的是一块内存.
B.new 初始化对象,调用对象的构造函数,对应的delete调用相应的析构函数,malloc仅仅分配内存,free仅仅回收内存
C.new和malloc都是保留字,不需要头文件支持
D.new和malloc都可用于申请动态内存和释放内存,new是一个操作符,malloc是是一个函数
new/delete都是要分两步操作的:new分配内存,并且调用对象的构造函数初始化一个对象;delete调用相应的析构函数,然后释放内存
malloc/free只是分配内存/回收内存, 所以A、B对;
malloc需要头文件”stdlib.h”或者”malloc.h” C错;
new/delete都是内建的操作符,而malloc是一个函数,其函数原型是:
void *malloc(unsigned int num_bytes);
所以选C
3.下面有关类的静态成员和非静态成员,说法错误的是?
静态成员存在于内存,非静态成员需要实例化才会分配内存
非静态成员可以直接访问类中静态的成员
静态成员能访问非静态的成员
非静态成员的生存期决定于该类的生存期,而静态成员则不存在生存期的概念
答案:C
静态成员属于类的,非静态成员属于对象的
非静态成员可以访问静态成员时因为类必定优先于对象而存在
反过来,静态成员不能访问非静态成员
4.在32位小端的机器上,如下代码输出是什么:
char array[12] = {0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 , 0x08};
short *pshort = (short *)array;
int *pint = (int *)array;
int64 *pint64 = (int64 *)array;
printf("0x%x , 0x%x , 0x%x , 0x%x", *pshort , *(pshort+2) , *pint64 , *(pint+2));
A.0x201 , 0x403 , 0x807060504030201 , 0x0
B.0x201 , 0x605 , 0x807060504030201 , 0x0
C.0x201 , 0x605 , 0x4030201 , 0x8070605
D.0x102 , 0x506 , 0x102030405060708 , 0x0
小端机器的数据高位字节放在高地址,低位字节放在低地址。x86结构为小端模式。
pshort占用2个字节,在内存中的16进制为0x01 0x02,对应的16进制数为0x0201。
pshort + 2指向array数组的下标为4的元素,占用2个字节,在内存中的16进制为0x05 0x06,对应的16进制数为0x0605。
pint64的int64类型不确定,但根据名字可以看出占用8个字节,对应的16进制形式为0x807060504030201。
pint + 2占用4个字节,指向的array数组的下标为8的元素,8-11个元素没有指定数组的初始化值,默认为0,因此*(pint + 2)对应的16进制为0。
选B
5.请问i的值是:
int main()
{
unsigned char i = 1;
i -= 4;
printf(“the value of i is: % d”, i);
}
A.253
B.254
C.255
D.256
unsigned char 总共8位,1-4 = -3,-3用8位二进制表示就是11111101(因为向前扩展最高位是多少就填多少,这里是1)因为是无符号数,所以最高位的1不做符号位,作为数值为,11111101对应的十进制数为253
6.下述程序的输出是____。
#include<stdio.h>
int main()
{
static char *s[] = {"black", "white", "pink", "violet"};
char **ptr[] = {s+3, s+2, s+1, s}, ***p;
p = ptr;
++p;
printf("%s", **p+1);
return 0;
}
A.ink
B.pink
C.white
D.hite