c++中,可以用类名直接访问非静态成员函数?
- 靜態函數?
- c++
- 關注?4?關注
- 收藏?0?收藏,1.7k?瀏覽
如題,看到一篇文章,說只要非靜態成員函數中沒有使用非靜態成員變量,就可以通過類名和域運算符來直接調用非靜態成員函數,而不需要實例來調用,是這樣嗎?
編譯器為vs2013
- 2016年06月05日提問
- 評論
- 邀請回答
- 編輯
3個回答
答案對人有幫助,有參考價值 3 答案沒幫助,是錯誤的答案,答非所問正規的C++語言標準目前(截止到C++14)應該還不支持這種調用方法。
目前微軟似乎在它的VC++中推行一種叫做C++/CLI的標準,有可能會支持這種調用,如果一定要用這種調用方法的話,還應該用VS2013嘗試編譯運行一下。
實際上,C++語言中類的靜態成員函數本身應該是所有這一類對象的集體所具有的行為,就是說,不是某一個對象能夠具有或者說實現的;而非靜態成員函數應該是某一個對象自己的動作行為,跟本類其他對象乃至整個類關系不大,是對象依靠自己的數據以及函數參數就可以完成的行為。
根據以上的討論,我們可以看出,很難存在一種需求,使得一個成員函數不需要引用本對象的非靜態成員,同時又必須是一個對象自己的行為(即聲明為非靜態成員函數)。如果真的存在不引用非靜態成員的成員函數,那還是直接聲明為靜態成員函數為好,這樣就可以萬無一失地通過編譯,也避免了移植性問題。
說句題外話,非靜態成員函數總會有一個隱含的參數,就是this指針。通過反匯編分析也可以發現,非靜態成員函數的調用屬于特殊的thiscall,就是說總會傳入一個this指針。而靜態成員函數和類外的函數一樣,經過編譯后都是普通的調用,不會得到this指針,因此也不可能訪問非靜態成員(因為非靜態成員的引用總是通過this指針完成的)。因此一個函數能否通過類名調用,主要還是要看它是否需要編譯器傳入this指針(要看編譯后的代碼,源代碼級別上的調用是看不到傳入的this指針的)。
如果真的希望在沒有實例的前提下,調用一個非靜態成員函數,可以使用下面的方法(前提是必須符合您提出的那個條件,即不訪問任何非靜態成員,如果它訪問了非靜態成員,則可能導致內存讀寫異常):
// 假設要引用的類類型為 TargetType, 成員函數為 void TargetType::TargetFunc(); // C++11 版: static_cast<TargetType *>(nullptr)->TargetFunc(); // C++98/03 版: reinterpret_cast<TargetType *>(0)->TargetFunc(); // 如果使用 C 風格的類型轉換操作符: ((TargetType *) 0)->TargetFunc();- 2016年06月05日回答
- 2 評論
- 編輯
類名可以訪問非靜態成員才怪了,那我怎么區分訪問的是哪個對象的非靜態?靜態可以理解為,所有用該類創建的對象都共享的變量。
- 2016年06月06日回答
- 1 評論
- 編輯
只要非靜態成員函數中沒有使用非靜態成員變量
這句話的意思是non-static member function里面沒有對this指針的調用,沒有調用this的non-static member function其實和static member差不了太多的。
你可以先把一個nullptr轉換成對應的class類型,再調用這個non-static memrber function,如下所示:
class A { public:void printHello() {cout << "hello" << endl;} };void test() {A *p = nullptr;p.printHello(); }總結
以上是生活随笔為你收集整理的c++中,可以用类名直接访问非静态成员函数?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: H.263 H.263+ Payload
- 下一篇: c++中为什么父类名可以直接调用自己的非