對于某些特定類類型的全體對象而言,訪問一個(gè)全局對象有時(shí)是有必要的。在程序運(yùn)行的任意點(diǎn)可能需要統(tǒng)計(jì)已創(chuàng)建的特定類類型對象的數(shù)量,但是全局對象會破壞封裝,并且沒有安全保護(hù),一般的用戶代碼就可以修改這個(gè)值。
類可以定義static成員,用于解決同一個(gè)類的不同對象之間數(shù)據(jù)和函數(shù)共享的問題,用一個(gè)類的不同對象的的靜態(tài)成員使用同一個(gè)內(nèi)存空間。靜態(tài)成員包含靜態(tài)數(shù)據(jù)成員和靜態(tài)函數(shù)成員。
通常,非static數(shù)據(jù)成員存在于類類型的每個(gè)對象中,但是static數(shù)據(jù)成員獨(dú)立于該類的任意對象而存在,每個(gè)static數(shù)據(jù)成員是與類關(guān)聯(lián)的對象,并不是與該類的對象關(guān)聯(lián)。
靜態(tài)成員函數(shù)沒有this形參,可以直接訪問所屬類的static成員,但是不能直接使用非static成員。
使用靜態(tài)成員的優(yōu)點(diǎn):
(1)有利于類的封裝,可以把static成員定義為私有成員,防止外部訪問;
(2)static成員是與特定的類關(guān)聯(lián)的,在外部必須使用類名字做前綴,程序更加清晰;
(3)static成員的名字是在類的作用域中,可以避免命名沖突。
(一)定義static成員
static遵循正常的公有、私有訪問限制。每一個(gè)要定義為static的成員前面都需要有static,這和訪問限制不同。
static成員函數(shù)可以直接定義在聲明的后面,也可以在類的外面定義。當(dāng)在類外面定義時(shí),不需要static關(guān)鍵字。
在靜態(tài)成員函數(shù)中,不可以使用this指針,因?yàn)殪o態(tài)成員函數(shù)是同一個(gè)類所有對象共有的。同樣靜態(tài)成員函數(shù)中也不可以使用非靜態(tài)的數(shù)據(jù)成員,只可以使用類的靜態(tài)數(shù)據(jù)成員。
class Student
{
public:
static int getCount();
static int count;
};
和普通的數(shù)據(jù)成員不同,static數(shù)據(jù)成員必須在類定義體的外部定義并初始化,定義的時(shí)候必須要有類名所前綴。
int Student::count=0;
(二)使用static成員
可以使用作用域運(yùn)算符“::”從類直間調(diào)用static成員,或者通過對象、引用該類類型對象的指針間接調(diào)用。如可以使用下面的方法訪問靜態(tài)成員。
Student::count=0;
int n=Student::getCount();
也可以通過類對象對靜態(tài)成員進(jìn)行訪問:
Student stu1;
stu1.count=0;
Student *s=&syu1;
int n=s->getCount();
當(dāng)在類的內(nèi)部使用靜態(tài)成員時(shí),可以直接使用,不需要作用域運(yùn)算符。此外可以使用非static成員的方法來使用static成員。
2.1使用靜態(tài)數(shù)據(jù)成員
#include
using namespace std;
class Test
{
public:
static int n;
Test(int x)
{
k = x;
n++;
}
void disp()
{
cout << "n= " << n << ", k=" << k << endl;
}
private:
int k;
};
int Test::n = 0;
int main()
{
Test t1(10);
t1.disp();
Test t2(20);
t2.disp();
Test::n++;
t2.disp();
system("pause");
return 0;
}
2.2 使用靜態(tài)成員函數(shù)
靜態(tài)成員函數(shù)可以直接引用該類的靜態(tài)數(shù)據(jù)成員和成員函數(shù),但不能引用非靜態(tài)成員。如果要引用非靜態(tài)成員,必須通過參數(shù)傳遞的方式得到對象名,再通過對象名來引用。使用靜態(tài)成員函數(shù)要注意的問題:
靜態(tài)成員函數(shù)可以在類內(nèi)定義,也可以在類外定義,在類外定義時(shí)不用再加關(guān)鍵字static;
系統(tǒng)限定靜態(tài)成員函數(shù)為內(nèi)部連接,這樣就不會因?yàn)榕c連接文件中的其他同名成員函數(shù)相沖突,保證了靜態(tài)成員函數(shù)的安全性;
靜態(tài)成員函數(shù)中沒有隱含this指針;
#include
using namespace std;
class Dot
{
static int t;
int a, b;
public:
Dot(int x = 0, int y = 0)
{
a = x;
b = y;
t++;
}
Dot(Dot &d);
int geta()
{
return a;
}
int getb()
{
return b;
}
static void gett()
{
cout << "object id:" << t << endl;
}
};
Dot::Dot(Dot &d)
{
a = d.a;
b = d.b;
t++;
}
int Dot::t = 0;
int main()
{
Dot::gett();
Dot d1(2, 3);
cout << "Dot d1:" << d1.geta() << "," << d1.getb() << endl;
d1.gett();
Dot d2(d1);
cout << "Dot d2:" << d2.geta() << ", " << d2.getb() << endl;
Dot::gett();
system("pause");
return 0;
}
-
C++
+關(guān)注
關(guān)注
22文章
2114瀏覽量
73914 -
static
+關(guān)注
關(guān)注
0文章
33瀏覽量
10414
原文標(biāo)題:C++類的static成員
文章出處:【微信號:gh_bee81f890fc1,微信公眾號:面包板社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
C++中的結(jié)構(gòu)和類
C++課程資料詳細(xì)資料合集包括了:面向?qū)ο蟪绦蛟O(shè)計(jì)與C++,算法,函數(shù)等
![<b class='flag-5'>C++</b>課程資料<b class='flag-5'>詳細(xì)</b>資料合集包括了:面向?qū)ο蟪绦蛟O(shè)計(jì)與<b class='flag-5'>C++</b>,算法,函數(shù)等](https://file.elecfans.com/web1/M00/56/EE/pIYBAFtDKEWAY420AAB8HnKodUs131.png)
基于fpgrowth的c++實(shí)現(xiàn)詳細(xì)資料免費(fèi)下載
VISUAL C++教程之VISUAL C++的安裝和使用方法
![VISUAL <b class='flag-5'>C++</b>教程之VISUAL <b class='flag-5'>C++</b>的安裝和使用方法](https://file.elecfans.com/web1/M00/7F/3A/o4YBAFwkkXWAI3XbAAMQcR8pLac666.png)
C++的cast最完整最詳細(xì)的解釋資料說明
![<b class='flag-5'>C++</b>的cast最完整最<b class='flag-5'>詳細(xì)</b>的解釋資料說明](https://file.elecfans.com/web1/M00/84/0F/o4YBAFxQAjmAfHs9AAJazk7RmHA196.png)
C++教程之?dāng)?shù)據(jù)線性結(jié)構(gòu)的詳細(xì)資料介紹
![<b class='flag-5'>C++</b>教程之?dāng)?shù)據(jù)線性結(jié)構(gòu)的<b class='flag-5'>詳細(xì)</b>資料<b class='flag-5'>介紹</b>](https://file.elecfans.com/web1/M00/85/52/pIYBAFxlJr2AJb2SAAHN9vC8KLY558.png)
Visual C++教程之C++的基礎(chǔ)知識介紹
![Visual <b class='flag-5'>C++</b>教程之<b class='flag-5'>C++</b>的基礎(chǔ)知識<b class='flag-5'>介紹</b>](https://file.elecfans.com/web1/M00/84/E7/o4YBAFxmeHWAZNqUAADfu76tYr0942.png)
C++程序設(shè)計(jì)教程之類的詳細(xì)資料說明
![<b class='flag-5'>C++</b>程序設(shè)計(jì)教程之類的<b class='flag-5'>詳細(xì)</b>資料說明](https://file.elecfans.com/web1/M00/85/59/o4YBAFxvXTOARwNtAAJSQn5iHGY495.png)
C++程序設(shè)計(jì)教程之C++工具的詳細(xì)資料說明
![<b class='flag-5'>C++</b>程序設(shè)計(jì)教程之<b class='flag-5'>C++</b>工具的<b class='flag-5'>詳細(xì)</b>資料說明](https://file.elecfans.com/web1/M00/89/3A/o4YBAFyKGU2ARmALAAKVagtx2S8669.png)
C語言和C++的特點(diǎn)與用法詳細(xì)說明
Visual C++的介紹和數(shù)據(jù)類型詳細(xì)說明
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>成員函數(shù)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論