日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++中,可以用类名直接访问非静态成员函数?

發布時間:2023/12/18 c/c++ 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++中,可以用类名直接访问非静态成员函数? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


  • 靜態函數?
  • c++
? xxdd11223?2016年06月05日提問
  • 關注?4?關注
  • 收藏?0?收藏,1.7k?瀏覽
問題對人有幫助,內容完整,我也想知道答案 0 問題沒有實際價值,缺少關鍵內容,沒有改進余地

如題,看到一篇文章,說只要非靜態成員函數中沒有使用非靜態成員變量,就可以通過類名和域運算符來直接調用非靜態成員函數,而不需要實例來調用,是這樣嗎?
編譯器為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 評論
  • 編輯
krantz72 聲望 答案對人有幫助,有參考價值 0 答案沒幫助,是錯誤的答案,答非所問

類名可以訪問非靜態成員才怪了,那我怎么區分訪問的是哪個對象的非靜態?靜態可以理解為,所有用該類創建的對象都共享的變量。

  • 2016年06月06日回答
  • 1 評論
  • 編輯
jinsongzhao35 聲望 答案對人有幫助,有參考價值 0 答案沒幫助,是錯誤的答案,答非所問

只要非靜態成員函數中沒有使用非靜態成員變量

這句話的意思是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++中,可以用类名直接访问非静态成员函数?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。