为什么指针为NULL还能调用成员函数?
2017-09-03 22:18
525 查看
以上程序中,下列哪个函数调用会有问题()
A、b->FunctionD();
B、b->FunctionB();
C、b->FunctionA();
D、b->FunctionC();
要理解这个的话。。。成员函数其实可以认为是一个普通的函数,比如
1 2 3 4 | class A{ public: void func(int x) { cout<<"hello, A. x="<<x<<endl; } }; |
1 | void A_func(A* this, int x) { cout<<"hello, A. x="<<x<<endl; } |
1 2 | A a; a.func(2); |
1 | A_func(&a, 2); |
1 2 3 4 5 6 | A *pa = NULL; pa->func(2); //在编译器看来就好像是 A_func(pa, 2);且pa==NULL ((A*)NULL)->func(2); //在编译器看来就好像是 A_func( ((A*)NULL), 2); |
上面的例子中func函数里并没有使用成员变量。考虑有成员变量并且在成员函数里使用的情况,就会不一样了:
1 2 3 4 5 6 | class A{ private: int y; public: void func(int x) { y = x; } }; |
1 | void A_func(A* this, int x) { this->y = x; } |
1 2 3 4 5 6 7 8 | A *pa = NULL; pa->func(2); //在编译器看来就好像是 A_func(pa, 2);且pa==NULL ((A*)NULL)->func(2); //在编译器看来就好像是 A_func( ((A*)NULL), 2); //好吧我承认这段代码跟上面的一毛一样啦! |
----又是我哈哈哈-----
结论:
通过对象调用成员函数,对象的指针会被传入函数中,指针名称为this
因此NULL对象指针也可以调用成员函数
NULL对象指针调用成员函数时,只要不访问此对象的成员变量,则程序正常运行
NULL对象指针调用成员函数时,一旦访问此对象的成员变量,则程序崩溃
下面是我加的
同理,当在调用虚函数时,对于一个虚拟函数调用
如b->FunctionB();
将会被转化成 (*b->vptr[1])(b),vptr表示由编译器产生的指针,指向virtual table,而1是virtual table slot的索引值,关联到FunctionB函数,此时b为NULL,因此肯定无法访问,出现错误。
相关文章推荐
- 为什么通过空指针(NULL)可以正确调用一些类的成员函数?
- 对象指针为NULL,为什么还是可以调用成员函数
- 为什么通过空指针(NULL)能够正确调用类的部分成员函数
- 为什么通过空指针(NULL)可以正确调用一些类的成员函数?
- 为什么通过空指针(NULL)可以正确调用一些类的成员函数?
- 为什么通过空指针(NULL)可以正确调用类的部分成员函数
- 浅析C++中的this指针 通过空指针(NULL)可以正确调用一些类的成员函数?
- C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- [疑问]C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- 空指针为什么能调用成员函数?
- 浅析C++中的this指针 通过空指针(NULL)可以正确调用一些类的成员函数?
- 详解this指针--为什么空的对象指针可以调用成员函数
- 空指针为什么能调用成员函数?
- 通过一个非法的指针或者NULL指针调用成员函数会发生什么?
- 不理解为什么调用一级指针作函数参数时候,就不能把myp1 = NULL,
- 浅析C++中的this指针 通过空指针(NULL)可以正确调用一些类的成员函数?
- 类成员函数调用(NULL指针调用)
- 空指针为什么能调用成员函数?
- NULL指针调用成员函数的例子
- 空指针为什么能调用成员函数?(转载)