亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過空類指針調用類方法

通過空類指針調用類方法

C++
守著星空守著你 2019-07-04 17:32:22
通過空類指針調用類方法我有以下代碼片段:class ABC{public:         int a;         void print(){cout<<"hello"<<endl;}};int main(){         ABC *ptr = NULL:         ptr->print();         return 0;}它成功地運行了。有人能解釋一下嗎?
查看完整描述

3 回答

?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

在這個框架下,大多數編譯器都會將類轉換為如下所示:

struct _ABC_data{  
    int a ;  };  // table of member functions void _abc_print( _ABC_data* this );

其中_abc_data是一個C型結構

還有你的電話ptr->print();將改為:

_abc_print( NULL)

在執行過程中,這是好的,因為您不使用this阿格。


最新情況:(感謝Windows程序員正確評論)
這樣的代碼只適用于執行它的CPU。
我們絕對沒有理智的理由去利用這一點。實施特征。這就是為什么:

  1. 因為標準聲明它會產生未定義的行為(任何人能給出一個鏈接或至少引用(第N章,PAR M.)?)
  2. 如果您實際上需要能夠在沒有實例的情況下調用成員函數,請使用

    靜態

    關鍵字提供所有可移植性和編譯時檢查。


查看完整回答
反對 回復 2019-07-04
?
泛舟湖上清波郎朗

TA貢獻1818條經驗 獲得超3個贊

使用不指向有效對象的指針調用成員函數將導致未定義行為..什么事都有可能發生。它可以運行;它可能會崩潰。

在這種情況下,它出現因為this不指向有效對象的指針不用于print.


查看完整回答
反對 回復 2019-07-04
?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

大多數答案都說,不明確的行為可能包括“出現”工作,他們是正確的。

AlexanderMalakhov的回答給出了一些常見的實現細節,并解釋了為什么您的情況似乎有效,但他做了一個輕微的錯誤陳述。他寫道:“既然你不使用這個Arg,所以執行時是好的”,意思是“因為你不使用這個Arg,所以在執行時看起來還不錯”。

但是請注意,您的代碼仍然是未定義的行為。它打印了你想要的,并把你銀行賬戶的余額轉到了我的賬戶上。謝謝你。

(所以Style說這應該是一個評論,但它太長了。不過,我還是成功了。)


查看完整回答
反對 回復 2019-07-04
  • 3 回答
  • 0 關注
  • 567 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號