天天看點

靜态成員變量和靜态成員函數在C++類中的作用

為了便于了解,我們先來說說面向過程設計中的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;
}
           

運作結果:

靜态成員變量和靜态成員函數在C++類中的作用

由于沒有this指針的額外開銷,是以靜态成員函數與類的全局函數相比,速度上會有少許的增長。需要總結一點的是,靜态成員不能通路非靜态成員,非靜态成員可以直接通路類中的靜态成員。

繼續閱讀