1. 程式人生 > >《面向物件程式設計 C++》類資料成員和類成員函式

《面向物件程式設計 C++》類資料成員和類成員函式

類資料成員

C++類中有一種型別成員,屬於類本身,而不屬於類的物件,這種型別成員成為類成員,而屬於物件的成員成為物件成員例項成員。可以使用關鍵字static來建立一個類成員。

static宣告與定義

class C
{
public:
    //...
private:
    static unsigned n;
    //...
};
unsigned C::n=0; //在外部定義時不需要加static

在類宣告內部宣告的static資料成員必須在任何程式塊之外定義。通過外部定義將C::n初始化為0,但這不是必須的,因為在建立第一個物件時,所有的靜態資料都會被初始化為零,除非提供一個不同的初值。並且在類體外定義的,不必使用static
static

資料成員不會影響該類及其物件的sizeof

#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的所有物件也都共享這個區域性變數。