通過將某個函數(shù)成員聲明為 static咪鲜,我們將使該函數(shù)獨(dú)立于本類的任何具體對象关翎。從靜態(tài)函數(shù)內(nèi)引用類成員橄登,必須使用限定名進(jìn)行(就像使用普通函數(shù)訪問公有數(shù)據(jù)成員那樣)熬荆。
靜態(tài)成員函數(shù)的優(yōu)點(diǎn)是:即使本類的任何對象都不存在,它們也能存在并被調(diào)用兔甘。這種情況下谎碍,靜態(tài)成員函數(shù)只能使用靜態(tài)數(shù)據(jù)成員,因?yàn)楹笳呤俏ㄒ淮嬖诘臄?shù)據(jù)成員洞焙。因此蟆淀,即使我們不能肯定是否有類對象存在,也可以調(diào)用類的靜態(tài)函數(shù)成員來檢查靜態(tài)數(shù)據(jù)成員澡匪。這樣熔任,我們即可用靜態(tài)成員函數(shù)來確定本類的對象是否已經(jīng)創(chuàng)建,或者實(shí)際創(chuàng)建的數(shù)量唁情。
例:static void Afun(int n);
可以通過:
① aBox.Afun(10); //對象調(diào)用
②CBox::Afun(10); //類+作用域調(diào)用
下面是一個在 Qt 框架下疑苔,使用 Qt Creator 實(shí)現(xiàn)的一個簡單的示例程序,我們可以從中看一下靜態(tài)成員函數(shù):
#include <QCoreApplication>
#include <QDebug>
#include <QUrl>
class OutputInfo
{
public:
OutputInfo()
// : m_printTimes(0) // [TOBY標(biāo)記] 初始化成員列表的重要性
{
s_printTimes++;
m_printTimes++;
}
~OutputInfo(){
s_printTimes--;
m_printTimes--;
}
static void s_output() {
qDebug() << "call static in static output "
<< s_printTimes << " times print!";
// 編譯出錯: 靜態(tài)成員函數(shù)中不能引用非靜態(tài)成員
// qDebug() << "call normal in static output "
// << m_printTimes << " times print!"; // error
/*
* 因?yàn)殪o態(tài)成員函數(shù)屬于整個類甸鸟,
* 在類實(shí)例化對象之前就已經(jīng)分配空間了惦费,
* 而類的非靜態(tài)成員必須在類實(shí)例化對象后才有內(nèi)存空間,
* 所以這個調(diào)用就出錯了抢韭,
* 這就是沒有聲明變量卻去使用它
*/
}
void m_output() {
qDebug() << "call static in normal output "
<< s_printTimes << " times print!";
qDebug() << "call normal in normal output "
<< m_printTimes << " times print!";
}
private:
static int s_printTimes;
int m_printTimes;
};
// 靜態(tài)成員初始化
int OutputInfo::s_printTimes = 0;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
OutputInfo::s_output();
OutputInfo* outputInfo = new OutputInfo;
// 此調(diào)用中我們發(fā)現(xiàn) m_printTimes 會顯示亂碼薪贫,
// 這也告訴我們,[TOBY標(biāo)記] 處初始化成員列表的重要性
// 有了初始化刻恭,這個值就是 0后雷,而不是亂碼
outputInfo->m_output();
outputInfo->s_output();
delete outputInfo;
OutputInfo::s_output();
outputInfo = new OutputInfo;
// 此調(diào)用中我們發(fā)現(xiàn) m_printTimes 會顯示亂碼,
// 這也告訴我們吠各,[TOBY標(biāo)記] 處初始化成員列表的重要性
// 有了初始化,這個值就是 0勉抓,而不是亂碼
outputInfo->m_output();
outputInfo->s_output();
delete outputInfo;
// 我們不調(diào)用構(gòu)造函數(shù)贾漏,我們是 0
OutputInfo::s_output();
OutputInfo::s_output();
OutputInfo::s_output();
return a.exec();
}
上面的示例的輸出大概是下面這樣的:
輸出結(jié)果
歡迎大家提出寶貴意見,謝謝