c++静态成员函数好处
生活随笔
收集整理的這篇文章主要介紹了
c++静态成员函数好处
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
靜態(tài)成員函數(shù)主要為了調(diào)用方便,不需要生成對(duì)象就能調(diào)用。
比如:
class X
{
public:void MethodA();static void MethodB();
}
此時(shí)MethodB可以直接調(diào)用,X::MethodB();
MethodA必須先生成類(lèi)對(duì)象才能調(diào)用,X x; x.MethodA();
函數(shù)的行為對(duì)所有派生類(lèi)都一致時(shí),可以聲明為靜態(tài)。
靜態(tài)成員函數(shù)的作用基本上相當(dāng)于:一個(gè)帶有命名空間的全局函數(shù)。
如一個(gè)數(shù)學(xué)類(lèi)定義了一些函數(shù) 都可以聲明偽靜態(tài)的 Math.sin(x)等
好處很多,但所有的好處都是基于:它跟類(lèi)的實(shí)例無(wú)關(guān),只跟類(lèi)有關(guān),不需要this指針。
至于可重入問(wèn)題,非靜態(tài)成員函數(shù)也有啊。為什么單單問(wèn)靜態(tài)函數(shù)的可重入問(wèn)題。
比如:
(1)可以實(shí)現(xiàn)某些特殊的設(shè)計(jì)模式:如Singleton;
(2)由于沒(méi)有this指針,可以把某些系統(tǒng)API的回調(diào)函數(shù)以靜態(tài)函數(shù)的形式封裝到類(lèi)的內(nèi)部。因?yàn)橄到y(tǒng)API的回調(diào)函數(shù)通常都是那種非成員函數(shù)(孤立函 數(shù)),沒(méi)有this指針的。比如你可以在類(lèi)的內(nèi)部寫(xiě)一個(gè)線程函數(shù)供CreateThread創(chuàng)建線程用,如果沒(méi)有靜態(tài)函數(shù),那么這種回調(diào)函數(shù)就必須定義成 全局函數(shù)(非靜態(tài)成員函數(shù)指針無(wú)法轉(zhuǎn)換成全局函數(shù)指針),從而影響了OO的“封裝性”。
(3)可以封裝某些算法,比如數(shù)學(xué)函數(shù),如ln,sin,tan等等,這些函數(shù)本就沒(méi)必要屬于任何一個(gè)對(duì)象,所以從類(lèi)上調(diào)用感覺(jué)更好,比如定義一個(gè)數(shù)學(xué)函數(shù)類(lèi)Math,調(diào)用Math::sin(3.14);如果非要用非靜態(tài)函數(shù),那就必須:Math? math;? ??math.sin(3.14);
行是行,只是不爽:就為了一個(gè)根本無(wú)狀態(tài)存儲(chǔ)可言的數(shù)學(xué)函數(shù)還要引入一次對(duì)象的構(gòu)造和一次對(duì)象的析構(gòu),當(dāng)然不爽。而且既然有了對(duì)象,說(shuō)不得你還得小心翼翼的定義拷貝構(gòu)造函數(shù)、拷貝賦值運(yùn)算符等等,對(duì)于一些純算法的東西顯然是不合適的。
(4)總之,從OOA/OOD的角度考慮,一切不需要實(shí)例化就可以有確定行為方式的函數(shù)都應(yīng)該設(shè)計(jì)成靜態(tài)的。
? ??? ??以上只是一些基本的考慮,并不是絕對(duì)的。絕對(duì)東西的只有一點(diǎn):“靜態(tài)函數(shù)不需要實(shí)例化就可以被調(diào)用,不會(huì)也不可以調(diào)用或操縱非靜態(tài)成員”。記住這一點(diǎn),那么實(shí)際編程中何時(shí)需要用,何時(shí)適合用,自然就更容易作出決定了。
?
總結(jié)
以上是生活随笔為你收集整理的c++静态成员函数好处的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CSR稀疏矩阵存储方式
- 下一篇: Qt中openGL的四个重要事件(ini