為了便于了解,我們先來說說面向過程設計中的static,對了解面向對象設計中的static多少會有些裨益,也可以加深大家對這方面知識的了解。面向過程中設計中的static主要從以下幾個方面來進行說明:
- 靜态全局變量,在其他檔案中可以定義相同的名字而不會發生沖突;
- 靜态局部變量儲存在全局資料區,而不是儲存在棧中,每次的值保持到一下次的調用,直到下次指派;
- 靜态函數隻能在聲明它的檔案當中可見,不能被其他檔案使用,在其他檔案中可以定義相同名字的函數,不會發生沖突。
面向對象設計中的static
一、靜态資料成員
1、概念
靜态資料成員在全局資料區配置設定記憶體,而非靜态成員需要執行個體化才會配置設定記憶體。
對該類的多個對象來說,靜态資料成員隻配置設定一次記憶體,供所有對象共用,靜态資料成員在程式中也隻有一份拷貝,由該類型的所有對象共享通路,是以靜态資料成員的值對每個對象都是一樣的,它的值可以更新。
而對于非靜态資料成員,當類别執行個體化後,可以通過執行個體化的類名進行通路,非靜态資料成員的生存期取決于該類的生存期,而且每個類對象都有自己的拷貝。而靜态成員則不存在生存期的概念,因為靜态資料成員始終駐留在記憶體中。
2、靜态資料成員初始化
靜态資料成員初始化與一般資料成員的初始化不同,
<資料類型><類名>::<靜态資料成員> = <值>;
eg:int MyClass::sum = 0;
靜态資料成員主要用在各個對象都有相同的某項屬性的時候。eg:存款類,每個對象的利息相同,是以把利息設為靜态資料成員。
好處:1、不管定義多少個存款類的對象,利息資料成員都共享配置設定在全局資料區的記憶體,是以節省了存儲空間;2、一旦利息需要改變是,隻要改變一次,則所有存款類對象的利息全部改變過來了。
二、靜态成員函數
1、概述
靜态成員函數為類全部服務,而不是為類的具體某一個對象服務。
2、普通成員函數和靜态成員函數的差別
普通成員函數一般都隐藏了一個this指針,this指針指向類的對象本身,因為普通成員函數總是具體的屬于某個類的具體對象的。
一般,this指針是預設的,但是與普通函數相比,靜态成員函數由于不是與任何的對象相聯系,是以它不具有this指針。從這個意義上講,靜态成員函數無法通路屬于類對象的非靜态資料成員,也無法通路非靜态成員函數,它隻能調用其餘的靜态成員函數。
3、舉例說明
#include <iostream>
using namespace std;
class MyClass {
public:
MyClass(int a,int b,int c);
static void func();
private:
int a, b, c;
static int sum;
};
int MyClass::sum = ;
MyClass::MyClass(int a,int b,int c)
{
this->a = a;
this->b = b;
this->c = c;
sum += a + b + c;
}
void MyClass::func()
{
cout << "sum=" << sum << endl;
}
void main()
{
MyClass M(, , );
M.func();
MyClass N(,,);
N.func();
MyClass::func();// 靜态成員函數的通路
return;
}
運作結果:
由于沒有this指針的額外開銷,是以靜态成員函數與類的全局函數相比,速度上會有少許的增長。需要總結一點的是,靜态成員不能通路非靜态成員,非靜态成員可以直接通路類中的靜态成員。