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

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

以下面的简单类来示例:

#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方法,并不是成员函数,其只是在类中定义的普通函数。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,746评论 2 9
  • 1.C和C++的区别?C++的特性?面向对象编程的好处? 答:c++在c的基础上增添类,C是一个结构化语言,它的重...
    杰伦哎呦哎呦阅读 9,514评论 0 45
  • 廖一梅说,“人这一生,遇到爱,遇到性,都不稀罕,稀罕的是遇到了解。” 遇见你,了解我,指方向,明未来。 生活本身是...
    梦影3阅读 481评论 0 0
  • 夜已深,寂寞时空可有一盏明亮的灯。在哪里我可以倾诉我的心声,在哪里我可以不用擦去我的泪痕……我可以放肆自己的情,超...
    青玫阅读 128评论 0 1
  • 确定了职业方向后,终于可以开始做减法了。 删掉了一堆微信公众号、屏蔽了一批朋友圈、精简了一轮书单……这样每天就可以...
    踢车刘阅读 151评论 0 0