C++: this指针、空的对象指针调用函数
1. this 是什么:
this是一个指针,指向对象实例。
2. 作用:
既然this指针指向对象实例,那this指针就相当于对象指针。有如下用法和注意事项:
- this指针只能在类内部使用而不能在外部使用。
- this指针可以访问类中所有public、private、protect的成员函数和变量
- this指针是指向对象的实例,所以只有当对象被创建时this指针才有效,所以:
- this指针不能用于static函数中,因为对象未被创建
- this指针是const的指针,无法被修改
3. 原理:
为什么要搞出来一个this指针,到底有什么作用,因为不通过this指针也是可以访问类的成员变量和成员函数的呀。
this指针其实是作为类成员函数的一个形参,在调用对象的接口时作为参数传递给成员函数。
只不过这个过程是隐式的,在编译阶段由编译器完成,默默地在成员函数中添加一个参数。把对象当前的首地址传入。
它是成员函数和成员变量关系的桥梁。
那么为什么要通过这种方式呢,有一定的历史原因:
C++是在C语言的基础上发展起来的。
最初C++的编译其实是将它翻译成C语言再进行编译的。但C语言只有全局函数,所以将C++中的类成员函数翻译成全局函数,把class翻译成struct。
为了方便用到类中的成员变量,则想到把类的对象作为参数传递给翻译过的全局函数。
class CCar { public: int price; void SetPrice(int p); }; void CCar::SetPrice(int p) { price= p; } int main() { CCar car; car.SetPrice(20000); return 0; }
翻译成C语言后:
struct CCar { int price; }; void SetPrice(struct CCar* this, int p) { this->price = p; } int main() { struct CCar car; SetPrice(&car, 20000); return 0; }
4. 空的对象指针调用类接口:
一个让人惊讶的例子。
本来以为,通过对象的指针访问类的函数时,这个对象的指针不能为空,否则会崩溃。但是下面这段代码可以成功运行。
#include <iostream> using namespace std; class A { int i; public: void Hello(){ cout << "hello" << endl; } }; int main() { A* p = NULL; p->Hello(); }
因为Hello这个函数不会用到成员变量,所以即时对象的指针为空也没关系。
另一个合理的解释:C++是一门静态绑定的语言。与java、python相比的一个显著区别。
动态绑定: java、python语言在调用类似上面 “p->Hello()” 的语句时会在运行过程中动态的寻找这个类、再通过类找到类函数进行调用。
静态绑定: C++,为了提高程序的运行效率,凡是可以在编译期确定的事情,就不会放在运行期去做。
像这种非虚函数,或者没有用到成员变量的情况下是不会用到传进来的this指针,也就是这个空指针的,所以不会照成崩溃。
“p->Hello()” 编译器会转换成:Hello(p);如果p没有被使用则不会引发问题。
C++只关系指针类型的正确与否,而指针的有效性需要程序员去关系。
以上代码参考:
http://c.biancheng.net/view/170.html
感谢。