>>> 背景
如果同時寫兩種類型語言的代碼,難免有的時候會產生一點混淆,這也正是思維碰撞的時候。今天來講一點Python類成員和C++類成員的構造區別。在C++里面,就要求把類成員顯式地聲明出來,這樣才能夠在構造函數里面對成員進行初始化,就如下所示。
class A
{
public:
int n_;
A(int n) : n_(n){}
};
如果使用python定義類的話,類成員的定義和初始化都放在了構造函數里面,少了那么一點儀式感,就如下面所示。
class Dog:
def __init__(self, m):
self.m_ = m
這個時候如果硬是要為python類先聲明一個成員,從語法上也是可以的,如下所示。
class Dog:
n_ = 0
def __init__(self, n):
self.n_ = n
這就引出了今天的問題,在python中像 n_ = **0 **這樣的語句,到底是什么含義呢?
>>> 解釋
其實在上述代碼中,為classDog創造了一個類靜態成員,該靜態成員為類所有的數據。而 self .m_ = m 才是為類的實例所有的數據。通過類靜態成員,可以管理一些實例無關的數據,比如某個數學類中的圓周率、已經創建的實例的個數等等。
如下面就通過 count** *** 這個類靜態成員,統計了實例化的次數;注意這里使用了 Dog.count*** ** 來訪問類靜態成員,而不是 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++創建類靜態成員的方法如下所示。使用關鍵字 static 來聲明一個靜態成員。對于非const類型的類靜態成員,C++還要求在類外部進行初始化,如int Dog::count = 0 ; 。
注意下面這種統計構造次數的方法僅僅是統計了普通構造,并沒有統計默認構造、拷貝構造或者賦值構造。通過析構函數可以看到,隨著對象的過期,對象的個數也逐漸減少到歸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++語言
+關注
關注
0文章
147瀏覽量
7021 -
python
+關注
關注
56文章
4807瀏覽量
84970
發布評論請先 登錄
相關推薦
評論