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

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

類實例上的C ++靜態成員方法調用

類實例上的C ++靜態成員方法調用

C++
慕姐4208626 2019-11-18 14:21:01
這是一個小測試程序:#include <iostream>class Test{public:    static void DoCrash(){ std::cout<< "TEST IT!"<< std::endl; }};int main(){    Test k;    k.DoCrash(); // calling a static method like a member method...    std::system("pause");    return 0;}在VS2008 + SP1(vc9)上,它可以正常編譯:控制臺僅顯示“ TEST IT!”。據我所知,不應在實例對象上調用靜態成員方法。我錯了嗎?從標準角度來看,此代碼正確嗎?如果正確,那為什么呢?我找不到為什么會允許使用它,或者可能是為了幫助在模板中使用“靜態或非靜態”方法?
查看完整描述

3 回答

?
婷婷同學_

TA貢獻1844條經驗 獲得超8個贊

2)如果正確,那為什么呢?我找不到為什么會允許使用它,或者可能是為了幫助在模板中使用“靜態或非靜態”方法?

在以下幾種情況下可能很有用:

  • [建議使用“模板中的“靜態或非靜態”方法“:]當可以為模板指定許多類型,然后該模板想要調用成員時:可以使用相同的符號來調用提供靜態函數的類型。作為成員函數-前者可能更有效(沒有this指向通過/綁定的指針),而后者允許多態(virtual)調度和成員數據的使用

  • 減少代碼維護

    • 如果功能從需要實例的數據演變為不需要的數據-因此static可以輕松實現無實例使用并防止實例數據的意外使用-無需費力地更新現有客戶端使用的所有方面

    • 如果更改了類型,則var.f()調用將繼續使用該var類型的函數,而Type::f()可能需要手動更正

  • 當您有一個表達式或函數調用返回一個值并想調用(可能或始終)static函數時,該.表示法可能會阻止您需要使用decltype或支持模板來訪問該類型,因此您可以使用該::表示法

  • 有時,變量名會更短,更方便或以更易于記錄的方式命名


查看完整回答
反對 回復 2019-11-18
?
森林海

TA貢獻2011條經驗 獲得超2個贊

該標準指出,不必通過實例調用該方法,這并不意味著您不能執行該方法。甚至有一個使用它的示例:


C ++ 03,9.4靜態成員


可以使用限定ID表達式X :: s來引用類X的靜態成員;不必使用類成員訪問語法(5.2.5)來引用靜態成員。可以使用類成員訪問語法來引用靜態成員,在這種情況下,將評估對象表達式。


class process {

public:

   static void reschedule();

};


process& g();


void f()

{

   process::reschedule(); // OK: no object necessary             

   g().reschedule(); // g() is called

}


查看完整回答
反對 回復 2019-11-18
?
DIEA

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

靜態函數不需要實例化的對象即可調用,因此


k.DoCrash();

行為與


Test::DoCrash();

使用范圍解析運算符(::)確定類內部的靜態函數。


注意,在這兩種情況下,編譯器都不會將this指針放在堆棧中,因為靜態函數不需要它。


查看完整回答
反對 回復 2019-11-18
  • 3 回答
  • 0 關注
  • 583 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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