从未写过博客,今天开个头吧。是在面试过程中遇到的一个题,写下来做个记录,给自己的面试mark下。
这么简单的题,竟然没答出来,面试官也是惊呆了。
题目如下:
class A
{
public:
int a;
void printA()
{
printf("hello world a = %d\n", a);
}
void printVoid()
{
printf("hello world void\n");
}
virtual void printvirtual()
{
printf("hello world virtual\n");
}
};
int main(int argc, char *argv[])
{
A *p = 0;
p->printA();
p->printVoid();
p->printvirtual();
return 0;
}
问分别调用 三个函数,会输出什么?
p->printA(); //挂掉
因为p指向空,没有对象,没有this指针,不能调用成员变量
p->printVoid(); //打印 hello world
p->printvirtual(); //挂掉
虚函数,和对象相关,没有对象,肯定不行 (所以,虚函数不能是static的)
总结下:
对于类成员函数言,并不是一个对象对应一个单独的成员函数体,而是此类的所有对象共用这个成员函数体。 当程序被编译之后,此成员函数地址即已确定。而成员函数之所以能把属于此类的各个对象的数据区别开,是靠this指针。函数体内所有对类数据成员的访问, 都会被转化为this->数据成员地方。