轉自:https://blog.csdn.net/weixin_40850689/article/details/83747958
C++提供static這個關鍵詞對靜態成員進行聲明,靜態成員函數和類的實例化無關,對於同一類來說,靜態成員函數是共享的。而普通成員函數需要實例化才能調用,對於每一個實例來說,普通成員函數是自己獨有的。
#include<iostream>
class Person
{
public:
void ordinaryfunc();//聲明一個普通成員函數
void static staticfunc();//聲明一個靜態成員函數
};
void Person::ordinaryfunc()
{
std::cout<<"from ordinary"<<std::endl;
}
void Person::staticfunc()//注意定義靜態函數不需要再帶static
{
std::cout<<"from staticfunc"<<std::endl;
}
void main()
{
Person::ordinaryfunc();//未實例化直接調用普通成員函數
std::cin.get();
}
1.調用成員函數
在未實例化就調用普通成員函數可以看到在VS2013報了一個error:非靜態成員函數的非法調用,所以普通成員函數要調用需要實例化。
Person::staticfunc();//未實例化直接調用靜態成員函數
成功調用靜態成員函數
2.通過函數指針調用成員函數
公有成員函數可以通過函數指針進行調用,調用成員函數也是需要實例化的。
函數指針調用普通成員函數:
void(Person::*pord)() = &Person::ordinaryfunc;
Person P1;
(P1.*pord)();//通過函數指針調用成員函數
(1)首先是函數指針的定義把函數名挖掉替換成函數指針的變量名:void(*函數指針變量名)();
(2)但類的普通成員函數指針需要帶上類名,並且在后面需要取類的地址:&Person::ordinaryfunc;
(3)在調用時也需要實例化,相當於每一個實例對應了自己的函數指針。
每個實例調用自己的函數指針:
Person P1,P2;
(P1.*pord)();//通過函數指針調用成員函數
(P2.*pord)();
函數指針調用靜態成員函數:
(1)調用靜態函數指針是不需要實例化的
(2)只需要指定是哪一個類的靜態函數
void(*psta)() = Person::staticfunc;
psta();
3.總結
(1)類的靜態函數和類無關
(2)類的靜態函數可以在未實例化前調用
(3)定義函數指針指向普通成員函數時,需要取類的地址,而調用時每一個實例有自己的函數指針
(4)用函數指針調用靜態成員函數時,僅需要指定類名
————————————————
版權聲明:本文為CSDN博主「KeepLiang」的原創文章,遵循 CC 4.0 BY-SA 版權協議,
原文鏈接:https://blog.csdn.net/weixin_40850689/article/details/83747958