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