快要毕业了为找工作做准备,最近在复习语言基础,看了面试宝典,现将自己认为重点的记录下来,方便以后更好的复习。
一,C++/C 基础
1. 类的大小,注意虚函数表,虚继承的话类大小与普通继承不同
(1)没有任何内容的类的大小是1。
(2)非虚函数在类中不占大小。
(3)包含有虚函数的类有一个虚表指针,指向的地址储存着虚函数的地址。
(4)类继承了几个包含虚函数的类,就有几个虚表指针。
(5)类虚继承其他类class a:virtual class b,包含两个虚表指针,一个是基类的,一个是自己的。
2. 指针数组,数组指针,比如int *a[10],int (*a)[10]
前者[10]是修饰的a的,而a是指针,所以表示10个整形指针。后者[10]是*a,*a是整形,所以表示1-个整形,a是指向整形数组首地址的指针。
3. 智能指针,放入stl容器里的问题,下面哪个正确
auto_ptr是用来使类自动析构的,没有定义拷贝构造函数,不能放到stl容器里。A,E正确。
4. 概率分布问题,求出下面显示
随机数落地概率的问题,x和y取到的数在0~RAND_MAX之间,x*x+y*y是点到原点的距离的平方,也就是距离<RAND_MAX。点的距离等于RAND_MAX是圆,
点落在圆里就能满足条件,就是说第一区间里,圆的面积与正方形的面积比,就是满足条件的概率,1/4 * 3.14 * RAND_MAX*RAND_MAX / RAND_MAX*RAND_MAX=0.78
5. vector拷贝的问题,找出下面的问题
6. 类成员变量初始化顺序,输出下面的显示结果
在base(int i):m_j(i),m_i(m_j){},先初始化先声明的变量即m_i,这样m_i初始化为一个随机数,m_j初始化为98
7. 多继承,向上指针转换的地址问题,求下面的输出
class c在内存里的分配包括class a和class b,pc指向class c的地址,pb指向class c中class b的地址,由于class a的大小是4,pb=pc+4。
if(pc==pb),由于pc和pb的类型不同,会发生隐式转换,pb会转换为pc,也即if(pc==(c*)pb),结果是相等的。if(int(pc)==int(pb)),由于指针指向的不同,所以结果是不相等。
8. static_cast dynamic_cast,const_cast,reinterpre_cast的不同,下面哪个正确
dynamic_cast<int><p> 用来类继承树中的转换,这里char* 和 int并没有继承关系,将返回NULL。会进行运行时类型检查。
static_cast<int>(p) 用来进行非强制转换,不能将指针强行转换成int等。会进行编译时类型检查。
const_cast<int>(p)用来去除const属性。
reinterpret_cast<int>(p)用来进行位拷贝转换,比如将int转换为float,只是拷贝两个数的位,转换后两个数大小是没关系的。
选D。
9.类空指针的问题,下面哪句话运行有问题
class classa{
public:
char a[3];
virtual void func(){
cout<<"1"<<endl;
}
void func2(){
cout<<"2"<<endl;
}
};
classa classa1=NULL;
classa1->func();
classa1->func2();
上面可以正常的运行,因为普通的类函数就是函数,只是多了一个this参数,当函数体内不需要访问类中的变量的时候就不会用到this指针,也就不会出现问题。
当修改函数func(){a[0]=1},就会在classa->func()崩溃。