美文网首页C++
C++空指针调用成员函数

C++空指针调用成员函数

作者: wenmingxing | 来源:发表于2018-09-04 22:24 被阅读15次

本文探索执行对象的空指针调用成员函数时会发生什么。

以下面的简单类来示例:

#include<iostream>

using namespace std;

class TestNullPtr {
public:
    void print() {
        cout << "print" << endl;
    }

    void getA() {
        cout << a << endl;
    }

    void setA(int x) {
        a = x;
    }

    virtual test() {
        cout << "test" << endl;
    }

private:
    int a = 100;
};

上面的代码中为类TestNullPtr定义了四个方法,分别是printgetAsetAtest。这四个方法的作用分别是打印字段打印类的元素a修改类元素a虚方法

I、空指针调用成员函数测试

1、我们先来看调用print方法会发生什么:

int main() {
    TestNullPtr* ptr = nullptr;
    ptr->print();
}

运行结果成功执行并正确打印:

2、再看调用getA会发生什么:

int main() {
    TestNullPtr* ptr = nullptr;
    ptr->getA();
}

程序虽然不会编译报错,但返回的是一个错误码,也没有正常执行:

3、再看调用setA会发生什么:

int main() {
    TestNullPtr* ptr = nullptr;
    ptr->setA(99);
}

可以看到结果与调用getA相同:

4、再看调用test虚方法会发生什么:

程序可以运行,但是返回错误码,没有执行对应代码:

II、测试结果分析

首先,类的成员函数并不与特定对象绑定,所有成员函数共用一份成员函数体,当程序编译后,成员函数的地址即已经确定。那为什么同一个类的不同对象调用对应成员函数可以出现不同的结果呢,答案就是this指针。

共有的成员函数体之所以能够把不同对象的数据区分开来,靠的是隐式传递给成员函数的this指针,成员函数中对成员变量的访问都是转化成"this->数据成员"的方式。因此,从这一角度说,成员函数与普通函数一样,只是多了一个隐式参数,即指向对象的this指针。

因此当所调用的成员函数有需要访问对象元素(getA)或者更改对象元素值(setA)时,由于没有this指针(因为现在this指针指向的是nullptr),就会导致不能正确执行。

同理,因为虚方法的调用是依赖于this指针的,所以同样会产生错误。

其实,上例中的print方法,并不是成员函数,其只是在类中定义的普通函数。

相关文章

  • C++基础

    1. C++中使用空对象指针调用成员函数 空指针对Test_Fun1和 Test_Fun2的调用正常,对Test_...

  • C++空指针调用成员函数

    本文探索执行对象的空指针调用成员函数时会发生什么。 以下面的简单类来示例: 上面的代码中为类TestNullPtr...

  • C++类的空指针调用成员函数

    答案:1处不会报错,正常输出 hello2处会报错,Segmentation fault

  • BD

    写一段代码实现shared ptr 虚拟内存 物理内存 c++ 成员函数存放位置, 如何调用. this指针如何传...

  • 第十章 对象和类(4)this指针和对象数组

    (四)this指针和对象数组 1.this指针是调用函数的对象的地址 this指针指向用来调用成员函数的对象,t...

  • c++中类的成员函数指针

      在c++中,使用函数指针的时候,我一般使用静态成员函数的指针。另外,还有一种普通成员函数的指针,我用的比较少。...

  • 2019-05-21 c++多态及指针引用踩坑记录

    1、空指针引用 void*& 编译会报错2、父类对象可以强制转换为子类对象,调用子类对象成员函数。

  • C++对象模型4——函数的调用

    普通成员函数的调用 C++的设计准则之一就是:普通成员函数的调用至少和全局函数有相同的效率。而事实上,C++编译器...

  • C++11可调用对象包装器和绑定器

    可调用对象 在C++中,可以像函数一样调用的有:普通函数、类的静态成员、仿函数、lambda函数、类的成员函数、可...

  • 2018-05-14

    双链表 双链表管理一个类的对象 //类 函数是共享的 数据是每个对象私有的//空指针 调用成员函数 没有访问数据...

网友评论

    本文标题:C++空指针调用成员函数

    本文链接:https://www.haomeiwen.com/subject/econwftx.html