空指针调用成员函数的编译和运行情况

文章通过实验展示了空指针调用成员函数在C++中的行为差异。对于非虚成员函数,尽管空指针调用能成功编译,但实际执行时会正常返回。然而,当调用虚函数时,虽然编译无误,但在运行时会出现错误,导致程序异常退出,无法执行函数体内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验内容:空指针调用成员函数(分虚和非虚讨论)的程序编译和运行情况
实验方法:编写一个类A,包含一个成员变量m_a和两个成员函数(非虚函数GetRefA和虚函数fun_v)。声明空指针分别调用虚成员函数和非虚成员函数,观察情况。
实验杰伦:1)非虚成员函数正常调用。原因是在编译器就发生了地址绑定,编译器不会给指针变量分配内存,不知道是空指针,只根据类型找到了对应的成员函数地址并绑定。
2)虚成员函数不能正常调用,尽管编译通过,但是在运行过程中没有正常运行虚函数中的函数体部分,并且程序异常退出,并没有输出第行代码的内容。

总结:空指针调用成员函数在编译阶段可以正常通过。在调用的是虚函数的时候,执行出错;调用非虚函数的时候,正常执行。


#include <iostream>
using namespace std;

class A {
public:
    A() { m_a = 1; }
    ~A() { }

    int GetRefA() {
        std::cout << "GetRefA()运行" << std::endl;
        return m_a;
    }

    virtual void fun_v() {
        std::cout << "fun_v()" << std::endl;
    }

    int m_a;
};

int main() {
    A* a = nullptr;

    // 空指针调用普通成员函数,返回非静态成员
    a->GetRefA();

    // 空指针调用虚成员函数,无法正常运行
    a->fun_v();
    cout << "程序即将退出" << endl;

    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值