C++學習--類的靜態函數和普通成員函數


轉自: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM