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

感谢。

 

posted @ 2021-02-16 16:52  Dylan_Liang  阅读(491)  评论(0编辑  收藏  举报