C和C++中static作用詳解

來源:互聯網
上載者:User

C中static的作用大致三種:

首先static的最主要功能是隱藏,其次因為static變數存放在靜態儲存區,所以它具備持久性和預設值0。

分開來說:

(1)隱藏。這點主要針對靜態全域變數和靜態函數。對於非靜態全域變數的範圍是整個來源程式(可能包含多個檔案),而靜態全域變數則將其範圍限定在本檔案內。同理,靜態函數也將其範圍限定在本檔案內。利用static實現了變數名和函數名的隱藏,從而其他檔案內可以有同名函數或變數而不互相影響。static函數在記憶體中只有一份,普通函數在每個被調用中維持一份拷貝。

(2)持久性。主要針對靜態局部變數,把局部變數改變為靜態變數後,儲存到靜態儲存區,即改變了它的生存期,範圍不變。static局部變數只被初始化一次。

(3)預設初始化為0。因為全域變數本來預設初始化為0,所以主要針對靜態局部變數。

 

C++中static作用:

除了在面向過程設計中相容C中特性外,C++中增加的含義體現在物件導向程式設計時,此時static表示屬於一個類而不是屬於此類的任何特定對象的變數和函數(與Java中此關鍵字的含義相同)。具體的情況為:

(1)類的靜態成員變數

在cpp中必須對它進行初始化,如

int Myclass::sum = 0;   //初始化待用資料成員,注意該處沒有static

如果變數被聲明為static,對象將只在執行線程第一次到達它的定義並初始化。

//oop.h#include<iostream>using namespace std;class Myclass{private:int a , b , c;static int sum;  //聲明待用資料成員public:Myclass(int a , int b , int c);void GetSum();};//oop.cpp#include "oop.h"int Myclass::sum = 0;   //定義並初始化待用資料成員Myclass::Myclass(int a , int b , int c){this->a = a;this->b = b;this->c = c;sum += a+b+c;}void Myclass::GetSum(){cout<<"sum="<<sum<<endl;}int main(void){Myclass M(1 , 2 , 3);M.GetSum();Myclass N(4 , 5 , 6);N.GetSum();M.GetSum();getchar();return 0;}

輸出為:6 21 21

(2)類的靜態函數
實現的時候也不需要static的修飾;類的靜態函數是在該類的範疇內的全域函數,只能訪問類的靜態成員(變數和函數),不需要類的執行個體即可調用;實際上,它就是增加了類的存取權限的全域函數。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.