Spring OXM- 漫談XML解析技術">Spring OXM- 漫談XML解析技術
720
2025-04-02
轉自:melonstreet
static與類
① 不和對象直接相關的數據,聲明為static
想象有一個銀行賬戶的類,每個人都可以開銀行賬戶。存在銀行利率這個成員變量,它不應該屬于對象,而應該屬于銀行這個類,由所有的用戶來共享。static修飾成員變量時,該成員變量放在程序的全局區中,整個程序運行過程中只有該成員變量的一份副本。而普通的成員變量存在每個對象的內存中,若把銀行利率放在每個對象中,是浪費了內存。
② static成員函數沒有this指針
static成員函數與普通函數一樣,都是只有一份函數的副本,存儲在進程的代碼段上。不一樣的是,static成員函數沒有this指針,所以它不能夠調用普通的成員變量,只能調用static成員變量。普通成員函數的調用需要通過對象來調用,編譯器會把對象取地址,作為this指針的實參傳遞給成員函數:
obj.func() ---> Class :: fun(&obj);
而static成員函數即可以通過對象來調用,也可以通過類名稱來調用。
③在類的外部定義static成員變量
另一個問題是static成員變量的定義。static成員變量必須在類外部進行定義:
class A
{
private:
static int a; //①
}
int A::a = 10; //②
注意①是聲明,②才是定義,定義為變量分配了內存。
④static與類的一些小應用
這些可以用來應付一下面試,在實現單例模式的時候,static成員函數與static成員變量得到了使用,下面是一種稱為”餓漢式“的單例模式的實現:
class A
{
public:
static A& getInstance();
setup(){...};
private:
A();
A(const A & rhs);
static A a;
}
這里把class A的構造函數都設置為私有,不允許用戶代碼創建對象。要獲取對象實例需要通過接口getInstance?!别I漢式“缺點在于無論有沒有代碼需要a,a都被創建出來。下面是改進的單例模式,稱為”懶漢式“:
class A
{
public:
static A& getInstance();
etup(){....};
private:
A();
A(const A& rsh);
...
};
A& A::getInstance()
{
static A a; // ☆
return a;
}
"懶漢式"只有在真正需要a時,調用getInstance才創建出唯一實例。這可以看成一個具有拖延癥的單例模式,不到最后關頭不干活。很多設計都體現了這種拖延的思想,比如string的寫時復制,真正需要的時候才分配內存給string對象管理的字符串。
C++
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。