>>> 背景
如果同時(shí)寫兩種類型語(yǔ)言的代碼,難免有的時(shí)候會(huì)產(chǎn)生一點(diǎn)混淆,這也正是思維碰撞的時(shí)候。今天來(lái)講一點(diǎn)Python類成員和C++類成員的構(gòu)造區(qū)別。在C++里面,就要求把類成員顯式地聲明出來(lái),這樣才能夠在構(gòu)造函數(shù)里面對(duì)成員進(jìn)行初始化,就如下所示。
class A
{
public:
int n_;
A(int n) : n_(n){}
};
如果使用python定義類的話,類成員的定義和初始化都放在了構(gòu)造函數(shù)里面,少了那么一點(diǎn)儀式感,就如下面所示。
class Dog:
def __init__(self, m):
self.m_ = m
這個(gè)時(shí)候如果硬是要為python類先聲明一個(gè)成員,從語(yǔ)法上也是可以的,如下所示。
class Dog:
n_ = 0
def __init__(self, n):
self.n_ = n
這就引出了今天的問題,在python中像 n_ = **0 **這樣的語(yǔ)句,到底是什么含義呢?
>>> 解釋
其實(shí)在上述代碼中,為classDog創(chuàng)造了一個(gè)類靜態(tài)成員,該靜態(tài)成員為類所有的數(shù)據(jù)。而 self .m_ = m 才是為類的實(shí)例所有的數(shù)據(jù)。通過類靜態(tài)成員,可以管理一些實(shí)例無(wú)關(guān)的數(shù)據(jù),比如某個(gè)數(shù)學(xué)類中的圓周率、已經(jīng)創(chuàng)建的實(shí)例的個(gè)數(shù)等等。
如下面就通過 count** *** 這個(gè)類靜態(tài)成員,統(tǒng)計(jì)了實(shí)例化的次數(shù);注意這里使用了 Dog.count*** ** 來(lái)訪問類靜態(tài)成員,而不是 self.count**_**。
class Dog:
count_ = 0
def __init__(self, n):
self.n_ = n
Dog.count_ += 1
if __name__ == '__main__':
for i in range(3):
g = Dog(2 * i)
print(Dog.count_, " n: ", g.n_)
>>
1 n: 0
2 n: 2
3 n: 4
相比而言,C++創(chuàng)建類靜態(tài)成員的方法如下所示。使用關(guān)鍵字 static 來(lái)聲明一個(gè)靜態(tài)成員。對(duì)于非const類型的類靜態(tài)成員,C++還要求在類外部進(jìn)行初始化,如int Dog::count = 0 ; 。
注意下面這種統(tǒng)計(jì)構(gòu)造次數(shù)的方法僅僅是統(tǒng)計(jì)了普通構(gòu)造,并沒有統(tǒng)計(jì)默認(rèn)構(gòu)造、拷貝構(gòu)造或者賦值構(gòu)造。通過析構(gòu)函數(shù)可以看到,隨著對(duì)象的過期,對(duì)象的個(gè)數(shù)也逐漸減少到歸0了。
class Dog
{
public:
static int count;
int n_;
Dog(int n): n_(n) { count++; }
~Dog() { count--; }
};
int Dog::count = 0;
int main()
{
{
Dog g1(0);
cout < < Dog::count < < " n: " < < g1.n_ < < endl;
Dog g2(2);
cout < < Dog::count < < " n: " < < g2.n_ < < endl;
Dog g3(4);
cout < < Dog::count < < " n: " < < g3.n_ < < endl;
}
cout < < Dog::count < < endl;
}
>>
1 n: 0
2 n: 2
3 n: 4
0
-
C++語(yǔ)言
+關(guān)注
關(guān)注
0文章
147瀏覽量
7044 -
python
+關(guān)注
關(guān)注
56文章
4811瀏覽量
85098
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
強(qiáng)大的matlab:在類中實(shí)現(xiàn)static成員變量 (轉(zhuǎn)帖)
C++筆記004:C++類通俗點(diǎn)說—— C結(jié)構(gòu)體復(fù)習(xí)
vc的常用類和成員函數(shù)
【微信精選】C++的精髓類和繼承就該這么理解!
如何把C++的源程序改寫成C語(yǔ)言
如何把C++的源程序改寫成C語(yǔ)言
如何把C++的源程序改寫成C語(yǔ)言
如何把C++的源程序改寫成C語(yǔ)言
如何把C++的源程序改寫成C語(yǔ)言
如何把C++的源程序改寫成C語(yǔ)言
類成員函數(shù)與普通函數(shù)的區(qū)別研究
C++中類的繼承訪問級(jí)別學(xué)習(xí)總結(jié)(二)
EE-128:C++中的DSP:從C++調(diào)用匯編類成員函數(shù)
![EE-128:<b class='flag-5'>C++</b>中的DSP:從<b class='flag-5'>C++</b>調(diào)用匯編<b class='flag-5'>類</b><b class='flag-5'>成員</b>函數(shù)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評(píng)論