1. 程式人生 > >C++靜態成員和靜態函式

C++靜態成員和靜態函式

C++類的靜態成員變數是需要初始化的,實際上不是為了初始化而初始化,本質上是要定義,分配記憶體。需要在類的外部進行定義。

靜態成員變數:

靜態成員變數和常用的全域性變數比較類似。

先看一個頭檔案animal.h

#ifndef DUOTAIJINGTAI_ANIMAL_H
#define DUOTAIJINGTAI_ANIMAL_H

#include <string>

class animal {
public:
    animal()= default;
    static void print(std::string &a);
    void Gettpye();
    static std::string type;
    int staif;

protected:
    int food;
    int fur;


};

#endif //DUOTAIJINGTAI_ANIMAL_H

這是我的一個類的標頭檔案,這裡面申明瞭一個靜態的string變數,當然申明完之後是不能用的,如果直接呼叫,直接報“未定義的錯誤”,那在哪裡定義呢,下面看

annimal.cpp

#include <iostream>
#include "../include/animal.h"
void animal:: print(std::string &a)
{
    //std::cout<<a<<staif<<std::endl;
    a="changed in print";
    std::cout<<a<<std::endl;
}
void animal:: Gettpye()
{
    std::cout<<type<<std::endl;
    type ="changed in get type";
    std::cout<<type<<std::endl;
}

std:: string animal::type ="hello";

我在cpp,也就是類外面定義的,定義方式就是[型別]+[類名]+[變數名],可以初始化,也可以不初始化,不初始化我試了一下,是空的字串。

以上是靜態變數,靜態存在的用處是不管哪個物件進行使用,它的記憶體只有一塊,所有相同類的物件,呼叫的靜態變數都是一個,每一個物件都可以對它進行操作,畢竟它是類成員。

靜態函式:

靜態函式是為靜態變數準備的,在實際外部操作靜態變數的時候,可以不申明物件,直接用靜態函式操作靜態變數,下面看主函式:

main.cpp

#include <iostream>
#include "include/animal.h"
#include <string>
int main() {
    animal::print(animal::type);
    animal::type ="hello delete";
    animal::print(animal::type);
    animal *test = new animal();
    test->Gettpye();
    animal::type ="hello delete change";
    animal test_;
    test_.Gettpye();

    return 0;
}

在外部使用靜態函式的方法是[類名]::[靜態函式],這樣可以直接對靜態變數進行操作,其實類內部函式對靜態變數也是一樣操作的,就如我定義的Gettype,這個函式也可以直接訪問靜態變數並修改。那為什麼還要有靜態函式呢。

我的理解就是靜態函式使用的時候不需要建立物件,而且靜態函式只能對靜態變數進行操作,類內部的非靜態變數它是沒有許可權碰的

總結就兩點:

1.靜態成員在申明完之後需要在類外部進行定義,本質是給它分配記憶體;靜態變數不通過申明物件,直接寫一個類的作用範圍,直接用,當然也可以通過物件呼叫,當然前提是是public的,可以在外部用,否則不行。而且靜態成員不管該類繼承了

2.靜態函式可以不通過申明物件,直接寫一個類的作用範圍,直接用,當然也可以通過物件呼叫;只能對靜態變數進行操作,類內部的非靜態變數它是沒有許可權碰的

應該說的差不多了,有疑問歡迎留言討論。