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.靜態函式可以不通過申明物件,直接寫一個類的作用範圍,直接用,當然也可以通過物件呼叫;只能對靜態變數進行操作,類內部的非靜態變數它是沒有許可權碰的
應該說的差不多了,有疑問歡迎留言討論。