1. 程式人生 > >static和const的作用

static和const的作用

static的作用 一、對變數 1、區域性變數 在區域性變數之前加上關鍵字static,區域性變數就被定義成為一個區域性靜態變數。 1)記憶體中的位置:靜態儲存區 2)初始化:未經初始化的全域性靜態變數會被程式自動初始化為0(自動物件的值是任意的,除非他被顯示初始化) 3)作用域:作用域仍為區域性作用域,當定義它的函式或者語句塊結束的時候,作用域隨之結束。(區域性作用域沒有改變,區域性作用域外部並不能訪問,離開作用於後它沒有被銷燬)

注:當static用來修飾區域性變數的時候,它就改變了區域性變數的儲存位置(從原來的棧中存放改為靜態儲存區)及其生命週期(區域性靜態變數在離開作用域之後,並沒有被銷燬,而是仍然駐留在記憶體當中,直到程式結束,只不過我們不能再對他進行訪問),但未改變其作用域。

2、全域性變數 在全域性變數之前加上關鍵字static,全域性變數就被定義成為一個全域性靜態變數。 1)記憶體中的位置:靜態儲存區(靜態儲存區在整個程式執行期間都存在) 2)初始化:未經初始化的全域性靜態變數會被程式自動初始化為0(自動物件的值是任意的,除非他被顯示初始化) 3)作用域:全域性靜態變數在宣告他的檔案之外是不可見的。準確地講從定義之處開始到檔案結尾。(在其它檔案是訪問不到的)

注:static修飾全域性變數,並未改變其儲存位置及生命週期,而是改變了其作用域,使當前檔案外的原始檔無法訪問該變數,好處如下:(1)不會被其他檔案所訪問,修改;(2)其他檔案中可以使用相同名字的變數,不會發生衝突。對全域性函式也是有隱藏作用。

二、對類中的 1、成員變數 用static修飾類的資料成員實際使其成為類的全域性變數,會被類的所有物件共享,包括派生類的物件。因此,static成員必須在類外進行初始化(初始化格式: int base::var=10;),而不能在建構函式內進行初始化,不過也可以用const修飾static資料成員在類內初始化 。

注意: (1)不要試圖在標頭檔案中定義(初始化)靜態資料成員。在大多數的情況下,這樣做會引起重複定義這樣的錯誤。即使加上#ifndef #define #endif或者#pragma once也不行。 (2)靜態資料成員可以成為成員函式的可選引數,而普通資料成員則不可以。 靜態資料成員的型別可以是所屬類的型別,而普通資料成員則不可以。普通資料成員的只能宣告為 所屬類型別的指標或引用。

2、成員函式 (1)用static修飾成員函式,使這個類只存在這一份函式,所有物件共享該函式,不含this指標。 (2)靜態成員是可以獨立訪問的,也就是說,無須建立任何物件例項就可以訪問。base::func(5,3);當static成員函式在類外定義時不需要加static修飾符。 (3)在靜態成員函式的實現中不能直接引用類中說明的非靜態成員,可以引用類中說明的靜態成員。因為靜態成員函式不含this指標。

const作用 1.限定變數為不可修改。 2.限定成員函式不可以修改任何資料成員。 3.const與指標: const在左邊, 表示指向的內容不能改變。 const在右邊,就是將P宣告為常指標,它的地址不能改變,是固定的,但是它的內容可以改變。

不可以同時用const和static修飾成員函式。加粗樣式