《面向物件程式設計 C++》類資料成員和類成員函式
阿新 • • 發佈:2018-12-21
類資料成員
C++類中有一種型別成員,屬於類本身,而不屬於類的物件,這種型別成員成為類成員,而屬於物件的成員成為物件成員或例項成員。可以使用關鍵字static來建立一個類成員。
static宣告與定義
class C
{
public:
//...
private:
static unsigned n;
//...
};
unsigned C::n=0; //在外部定義時不需要加static
在類宣告內部宣告的static資料成員必須在任何程式塊之外定義。通過外部定義將C::n初始化為0,但這不是必須的,因為在建立第一個物件時,所有的靜態資料都會被初始化為零,除非提供一個不同的初值。並且在類體外定義的,不必使用static
static
#include<iostream>
using namespace std;
class C
{
public:
int a;
unsigned long b;
//...
private:
//static unsigned n1; //does not impact sizeof(C)
//static unsigned n2; //does not impact sizeof(C)
//...
};
int main()
{
cout<<sizeof(C)<<endl;
C c1;
cout<<sizeof(c1)<<endl;
return 0;
}
類成員函式
除了static資料成員,類還可以有static成員函式。靜態成員函式只能訪問其他的static成員,包括資料成員和成員函式。
class C
{
public:
static unsigned getN()
{
setST(); //ERROR:not static!
return n;
}
private:
unsigned n;
}
靜態成員函式與非靜態成員函式差別是:非static成員函式既可以訪問static資料成員,也可以訪問非static資料成員;而static成員函式只能訪問static成員。
類的static成員的訪問
有兩種不同方式來訪問類的static成員,既可以通過C的物件來訪問,也可以直接通過類C來訪問。
#include<iostream>
using namespace std;
class C
{
public:
static void getN()
{
cout<<n<<endl;
}
private:
static unsigned n;
};
unsigned C::n=10;
int main()
{
C::getN(); //直接通過類C來訪問
C c1;
c1.getN(); //通過C的物件來訪問
return 0;
}
在類成員函式內定義static變數
#include<iostream>
using namespace std;
class C
{
public:
void m();
private:
static unsigned n;
};
unsigned C::n=100;
void C::m()
{
static int s=0;
cout<<"s="<<++s<<endl;
cout<<"n="<<n++<<endl;
cout<<endl;
}
int main()
{
C c1,c2;
c1.m();
c2.m();
c1.m();
return 0;
}
輸出結果:
s=1
n=100
s=2
n=101
s=3
n=102
本例在成員函式m中定義了一個static變數s,由於s定義在程式塊內,他擁有程式塊範圍,因為只能在m內部訪問。每呼叫m一次,s就會相應的增加一次,又因為m是C的成員函式,所以C的所有物件都共享這個靜態區域性變數,這樣,對m的每一次呼叫訪問的都是同一個s,同樣,對於靜態區域性變數n來說,它也是一個靜態區域性變數,所以C的所有物件也都共享這個區域性變數。