7.1
面试题1:
引用不能为空,必须总是指向某些对象。所以必须初始化。
面试题2:略。
7.2
面试题1:略。
面试题2:
编译器总是要为函数的每个参数制作临时副本。运行后,副本自动删除。
题目中,GetMemory(),先为str生成一个副本p,这个副本p先指向str所指向的位置, 当malloc一个区间给p后, p指向malloc的区间,但是函数结束后, 回收p,此时,没有将区间返回给str,因此会造成内存泄漏。
面试题3:
返回的结果是不确定且不安全,随时有被回收的可能。
面试题4:略。
面试题5:
本题考察的是对内存偏移的理解。B* pb=(B*)(&a);是将a强制转化成B类型,并将a的地址赋值给pb;也就是说pb指向的是类型为A的一篇内存空间。 因为B只有一个元素int m_c,编译器对m_c的认识就是m_c是对象的偏移量0。同时,A中的第一个m_a的偏移量也为0; 当调用pb->fun()时,调用的是B类型的fun()函数,函数输出m_c的值,由于编译器认为对象偏移量为0的就是m_c,所以这个时候输出的是m_a。
如果把两个类型颠倒过来,A变B,B变A,则输出的是3和一个任意数。
再若把题目改成如下:
class A
{
public:
A(){m_a=1;m_b=2;}
~A(){};
void fun()
{
printf("%d%d",m_a,m_b);
}
private:
int m_a;
int m_b;
};
class B
{
public:
B(){m_c=3;m_d=4;}
~B(){};
void fun()
{
printf("%d\n",m_c);
}
void fun1()
{
printf("%d\n",m_d);
}
private:
int m_c;
int m_d;
};
int main(int argc, char* argv[])
{
A a;
B* pb=(B*)(&a);
pb->fun1();
return 0;
}
则此时结果为2。
面试题6:
不能给一个指针分配一个随意的地址。
面试题7:略。
面试题8:
主函数main中可以不谢return语句,因为编译器会隐式返回0。但是在一般函数中没return语句是不行的。
面试题9:
当语句运行到s.p[1]=1时,这个时候s.p的指针就变成了指向地址空间为0x00000001的指针,这个时候再运行s.p[0]=2,则由于对于一个未做声明的地址直接访问,而访问出错。
7.3
面试题1:略。
面试题2:
函数指针的声明:
void (*f)();
int max(int, int);
int (*p)(int,int)=&max;
or
int max(int,int);
int (*p)();
p=max;
7.4
面试题1:略。
面试题2:略。
面试题3:略。
面试题4:
两个区分开来
A代码区: 输出2 5
int main(int argc, char* argv[])
{
int a[]={1,2,3,4,5};
int* ptr=(int*)(&a+1);
printf("%d %d",*(a+1),*(ptr-1));
return 0;
}
B代码区:输出2 1
int main(int argc, char* argv[])
{
int a[]={1,2,3,4,5};
int* ptr=(a+1);
printf("%d %d",*(a+1),*(ptr-1));
return 0;
}
7.5
面试题1:
迷途指针,悬浮指针,失控指针,野指针。即当对一个指针进行delete操作后,虽然释放了它所指向的内存,但并没有把它设置为空。这个指针仍然指向原来的内存区域,但是编译器已经把这块内存区域分配给了其他的数据。再次使用这个指针会导致程序崩溃。
面试题2:略。
面试题3:略。
面试题4:略。
7.6
面试题1:略。
面试题2:
智能指针:auto_ptr是安全指针,在指针析构的时候,自动删除此指针。
7.7
面试题1:
1 this指针本质是一个函数参数,只不过隐藏起来了。针对的是一个类的实例。因此,this指针只能在成员函数中使用。全局函数、静态函数都不能使用this。
2 this在成员函数开始前构造,在成员的结束后清除
3 this指针不占用对象的空间,他只会占用参数传递时的栈空间,或者直接占用一个寄存器。
4 this是指向对象的常指针
具体看书!! 没法总结。