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