C++中關鍵字的理解--Static

來源:互聯網
上載者:User

標籤:color   under   bin   記憶體地區   編碼   存取權限   不同   static   許可權   

C++中關鍵字的理解---Static

目錄:1、static緣起

            2、static自我理解

            3、static舉例使用

            4、總結

--------------------------------------------------------------------------------------------------

1、static緣起

        C語言是面向過程構架,多檔案為單位的編碼的優異之處在於保持不同源檔案和函數之間的相互引用(即聯絡)和相互獨立,因而產生了extern和static關鍵字。而面向過程的C和物件導向的C++有千絲萬縷的聯絡,暫且不說用C可以完全構架和類比衍化出C++,第二部分用我自己的理解會用一句話來描述:關鍵字static同C++的牽連。除此之外,需要知道:既然關鍵字Static修飾的是變數/函數,那麼這些資料都放在哪?

        ---進程在記憶體中的布局:

   

         中的文本段保持的是程式的位元據;.data段儲存進程所有已初始化的全域變數;.bss(Block Started by Symbol)段儲存程式中未被初始化的全域變數的一塊記憶體地區,該段屬於靜態記憶體配置。進程的生命週期中,.data段和.bss段內資料同整個進程步伐一致。

2、static自我理解

       static類似於C++中私人保護,專屬性由於深海魚和水的關係,離開深海既死(程式出錯)。

       C++private私人保護(只在類內活動,可通過成員函數調用,類外使用不行);

       static靜態全域變數(只在定義它的源檔案--c/cpp,中有效,其他源檔案無法訪問);

       有人形象的形容普通全域變數穿上static外衣後,它就變成了新娘,已心有所屬,只能被定義它的源檔案(新郎)中的變數或函數訪問。

3、static舉例使用

       1>全域靜態變數

         file1.h:聲明子代碼    

#include<stdio.h>void printStr();void printS();
file1.h

            file1.cpp定義一個靜態全域變數hello,僅可以在file1.cpp下的函數printStr和printS訪問

#include"file1.h"static char* hello = "hello cobing!";void printStr(){    printf("%s\n", hello);}void printS(){    printf("%s\n", hello);    printf("%s\n", hello);}
file1.cpp

            file2.cpp引用file1.h聲明下和調用file1.cpp下的定義函數,來對比是否能在不同源檔案下來對靜態全域變數訪問

#include"file1.h"void printfileStr(){    printf("%s\n", hello);}
file2.cpp

            結果證明是不行的。

          main.cpp主檔案中的main函數通過調用file1下的函數可以訪問靜態全域變數,這和C++中private無異

#include"file1.h"int main(){    printStr();    printS();    return 0;}
View Code

            上面幾個函數證明了靜態全域變數的私人保護性比較??!

       2>局部靜態變數

          局部靜態變數 VS 普通局部變數

           1】 位置: 靜態局部變數被編譯器放在全域儲存區.data,所以它雖然是局部的,但是在程式的整個生命週期中存在。

           2】 存取權限:靜態局部變數只能被其範圍內的變數或函數訪問。也就是說雖然它會在程式的整個生命週期中存在,由於它是static的,它不能被其他的函數和源檔案訪問。

           3】 值:靜態局部變數如果沒有被使用者初始化,則會被編譯器自動賦值為0,以後每次調用靜態局部變數的時候都用上次調用後的值。這個比較好理解,每次函數調用靜態局部變數的時候都修改它然後離開,下次讀的時候從全域儲存區讀出的靜態局部變數就是上次修改後的值。

           -------一句話,靜態局部變數的私人保護強度進一步(╯▔皿▔)╯升級,在靜態全域基礎上限制為:只能在同源檔案下的同函數內。

           eg:

            file1.h用上面的即可。

/*static 局部*/void  printStr(){    int normal = 0;    static int stat = 0;//靜態局部變數    printf("normal = %d ---- stat = %d\n", normal, stat);     normal++;    stat++;}
file1.cpp

              上面直接應用是有錯的,證明的是私人性更強了。

                                                

               上面結果證明:靜態局部變數的時候都用上次調用後的值(好像記憶斷電,每次在原來基礎上作用)。但普通的局部變數一直是初始化的狀態為0;

       3>靜態函數

            參考連結:http://blog.csdn.net/keyeagle/article/details/6708077/      作者寫的已經非常(??????)??棒了!

4、總結

         一句話,Static生在C 類似C++中private;

C++中關鍵字的理解--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.