猿问

通过空类指针调用类方法

通过空类指针调用类方法

我有以下代码片段:

class ABC{public:
        int a;
        void print(){cout<<"hello"<<endl;}};int main(){
        ABC *ptr = NULL:
        ptr->print();
        return 0;}

它成功地运行了。有人能解释一下吗?


守着星空守着你
浏览 512回答 3
3回答

暮色呼如

在这个框架下,大多数编译器都会将类转换为如下所示:struct&nbsp;_ABC_data{&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;a&nbsp;;&nbsp;&nbsp;};&nbsp;&nbsp;//&nbsp;table&nbsp;of&nbsp;member&nbsp;functions&nbsp;void&nbsp;_abc_print(&nbsp;_ABC_data*&nbsp;this&nbsp;);其中_abc_data是一个C型结构还有你的电话ptr->print();将改为:_abc_print(&nbsp;NULL)在执行过程中,这是好的,因为您不使用this阿格。最新情况:(感谢Windows程序员正确评论)这样的代码只适用于执行它的CPU。我们绝对没有理智的理由去利用这一点。实施特征。这就是为什么:因为标准声明它会产生未定义的行为(任何人能给出一个链接或至少引用(第N章,PAR M.)?)如果您实际上需要能够在没有实例的情况下调用成员函数,请使用静态关键字提供所有可移植性和编译时检查。

泛舟湖上清波郎朗

使用不指向有效对象的指针调用成员函数将导致未定义行为..什么事都有可能发生。它可以运行;它可能会崩溃。在这种情况下,它出现因为this不指向有效对象的指针不用于print.

至尊宝的传说

大多数答案都说,不明确的行为可能包括“出现”工作,他们是正确的。AlexanderMalakhov的回答给出了一些常见的实现细节,并解释了为什么您的情况似乎有效,但他做了一个轻微的错误陈述。他写道:“既然你不使用这个Arg,所以执行时是好的”,意思是“因为你不使用这个Arg,所以在执行时看起来还不错”。但是请注意,您的代码仍然是未定义的行为。它打印了你想要的,并把你银行账户的余额转到了我的账户上。谢谢你。(所以Style说这应该是一个评论,但它太长了。不过,我还是成功了。)
随时随地看视频慕课网APP
我要回答