静态成员函数调用方式--收藏帖子
原帖子地址:https://bbs.csdn.net/topics/390750229
靜態(tài)成員函數(shù)調(diào)用方式?
A::?s_fun();//不需要額外傳遞一個參數(shù),作為this?指針;因為靜態(tài)函數(shù),屬于類,不屬于具體對象。
非靜態(tài)成員函數(shù)調(diào)用方式?。
非靜態(tài)成員函數(shù),屬于對象,需要隱式傳遞?this?指針作為參數(shù)。
A a;
A &ref=a;
A *ptr = &a;
int main(){
a.fun();?? // 1)對象; 傳遞&a, 即a 的地址作為 fun的 this 指針;
ref.fun();? // 2)引用;傳遞&ref,也即&a? 即a 的地址作為 fun的 this 指針;
ptr->fun();? // 3)指針; 傳遞 ptr ,也即&a? 即a 的地址作為 fun的 this 指針;
return?0;
}
靜態(tài)成員函數(shù),可以調(diào)用非靜態(tài)成員函數(shù),反之非靜態(tài)成員函數(shù)也可以調(diào)用靜態(tài)成員函數(shù);
在靜態(tài)成員函數(shù),內(nèi)部調(diào)用非靜態(tài)成員函數(shù),需要一個額外的對象,這個對象可以是任何可見的,可以訪問的全局變量,靜態(tài)變量(對象,引用,指針對應(yīng)的對象)
也可以是靜態(tài)成員函數(shù)的參數(shù)(通過對象,引用,指針),以及靜態(tài)函數(shù)內(nèi)部定義的局部變量。
非靜態(tài)成員函數(shù),可以直接調(diào)用靜態(tài)成員函數(shù)。
非靜態(tài)函數(shù),可以隱式的通過this指針,調(diào)用除了構(gòu)造析構(gòu)構(gòu)函數(shù)之外的,任何非靜態(tài)成員函數(shù)。
也可以顯示的通過this指針,調(diào)用除了構(gòu)造析構(gòu)構(gòu)函數(shù)之外的,任何非靜態(tài)成員函數(shù)。
可以調(diào)用構(gòu)造函數(shù),構(gòu)造本類的其他對象。
也可以自動調(diào)用析構(gòu)函數(shù),析構(gòu)本類的其他對象。
有時候甚至可以顯式調(diào)用析構(gòu)函數(shù),析構(gòu)某些對象。
例如:
a::fun_ather(){}
a:: fun(){
?fun_ather();?????????? //隱式的通過this指針,調(diào)用其他非靜態(tài)成員函數(shù),這是下面式子的省略寫法。
?this-> fun_ather();//顯示的通過this指針,調(diào)用其他非靜態(tài)成員函數(shù)。
}
this?指針,是對象調(diào)用函數(shù)的時候,隱式傳遞的。因為形參表,以及實參表里面都沒有直接使用this?這個參數(shù);
所以他是隱式的自動傳遞的;
方式很簡單,就是??a.fun(),r.fun(),?ptr->fun()?,這種寫法的前面那個數(shù)據(jù)中,對象的地址傳遞給?this。
編譯器安排某種方法,傳遞這個參數(shù);
例如:VC6~VC10,32Bits?采用ecx?寄存器傳遞this?指針。
PS:
估計,要么是你只看到書中內(nèi)容的一個片段;
要么是編者,并不是很理解C++靜態(tài)成員函數(shù),非靜態(tài)成員函數(shù);
靜態(tài)成員函數(shù),可以非靜態(tài)成員函數(shù);反之亦然;
只是調(diào)用方式有所不同。
1)類外函數(shù)調(diào)用成員函數(shù)
1.1)其他函數(shù)調(diào)用成員函數(shù),調(diào)用靜態(tài)成員函數(shù),需要通過類名調(diào)用;A::?s_fun();
1.2)其他函數(shù)調(diào)用成員函數(shù),調(diào)用非靜態(tài)成員函數(shù),通過對象調(diào)用;?a.fun();r.fun();ptr->fun()?;
2)成員函數(shù)的互相調(diào)用:
2.1靜態(tài)成員函數(shù)調(diào)用靜態(tài)成員函數(shù),直接用函數(shù)名?s_fun();
2.2)?非靜態(tài)成員函數(shù)調(diào)用靜態(tài)成員函數(shù),直接用函數(shù)名?s_fun();
2.3非靜態(tài)成員函數(shù)調(diào)用非靜態(tài)成員函數(shù),也可以直接用函數(shù)名,fun()?;這是通過this指針來調(diào)用的。
2.4)靜態(tài)調(diào)用非靜態(tài),由于調(diào)用靜態(tài)函數(shù)的代碼,沒有傳遞對象相關(guān)參數(shù)this指針,需要通過其他可以訪問的對象來調(diào)用。
????????a.fun();r.fun();ptr->fun()?;
作為以上所有總結(jié),可以看下面的例子
? class A
{
?????? int x;
?????? static A a;
????? public:
????? void fun(){};
????? void fun_other(){};
?????? static void s_fun();
?????? static void s_fun(A & ref);
???????
??};
???? A A::a;
???? A a0;?
???? void A::s_fun()
? ? {?
? ? ? ? a.fun();
? ? ? ? a0.fun();
? ? ? ? s_fun(a);
? ? ? ? s_fun(a0);??
? ? };
????? void A::s_fun(A & ref)
? ? {?
? ? ? ? ref.fun();
? ? ? ? a.fun();
? ? ? ? a0.fun();?????
? ? }
??? int main()
? ? {
? ? ? ? ?A:;s_fun();
? ? ? ? return 0;
???? }
?
總結(jié)
以上是生活随笔為你收集整理的静态成员函数调用方式--收藏帖子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】C++ this指针(直戳本质)
- 下一篇: 杂七杂八的命令行