从未写过博客,今天开个头吧。是在面试过程中遇到的一个题,写下来做个记录,给自己的面试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->数据成员地方。