C++ static与const用法详解
目錄
static的作用:
對普通變量:
1.局部變量:
2.全局變量
對類中變量:
1.成員變量
2.成員函數
const的作用:
static的作用:
對普通變量:
1.局部變量:
在局部變量之前加上關鍵字static,局部變量就被定義成為一個局部靜態變量。
? 1)內存中的位置:靜態存儲區
? 2)初始化:未經初始化的全局靜態變量會被程序自動初始化為0(自動對象的值是任意的,除非他被顯示初始化)
? 3)作用域:作用域仍為局部作用域,當定義它的函數或者語句塊結束的時候,作用域隨之結束。
?注:當static用來修飾局部變量的時候,它就改變了局部變量的存儲位置(從原來的棧中存放改為靜態存儲區)及其生命周期(局部靜態變量在離開作用域之后,并沒有被銷毀,而是仍然駐留在內存當中,直到程序結束,只不過我們不能再對他進行訪問),但未改變其作用域。
2.全局變量
在全局變量之前加上關鍵字static,全局變量就被定義成為一個全局靜態變量。
1)內存中的位置:靜態存儲區(靜態存儲區在整個程序運行期間都存在)
2)初始化:未經初始化的全局靜態變量會被程序自動初始化為0(自動對象的值是任意的,除非他被顯示初始化)
3)作用域:全局靜態變量在聲明他的文件之外是不可見的。準確地講從定義之處開始到文件結尾。
這里面值得注意的是,不管是局部變量、全局變量還是普通函數,只要被static修飾了,其作用域只對自己的編譯單元有效(包含.h和.cpp文件),有static修飾變量的頭文件被其他文件包含,其他文件是不能使用該變量的。
注:static修飾全局變量,并未改變其存儲位置及生命周期,而是改變了其作用域,使當前文件外的源文件無法訪問該變量,好處如下:(1)不會被其他文件所訪問,修改;(2)其他文件中可以使用相同名字的變量,不會發生沖突。對全局函數也是有隱藏作用。而普通全局變量只要定義了,任何地方都能使用,使用前需要聲明所有的.c文件,只能定義一次普通全局變量,但是可以聲明多次(外部鏈接)。
注意:全局變量的作用域是全局范圍,但是在某個文件中使用時,必須先聲明,使用extern關鍵字或者包含全局變量聲明的頭文件
對類中變量:
1.成員變量
用static修飾類的數據成員實際使其成為類的全局變量,會被類的所有對象共享,包括派生類的對象。因此,static成員必須在類外進行初始化(初始化格式: int base::var=10;),而不能在構造函數內進行初始化,不過也可以用const修飾static數據成員在類內初始化 。
特點:
1)、不要試圖在頭文件中定義(初始化)靜態數據成員。在大多數的情況下,這樣做會引起重復定義這樣的錯誤。即使加上#ifndef #define #endif或者#pragma once也不行。?
2)、靜態數據成員可以成為成員函數的可選參數,而普通數據成員則不可以。
3)、靜態數據成員的類型可以是所屬類的類型,而普通數據成員則不可以。普通數據成員的只能聲明為 所屬類類型的指針或引用。
2.成員函數
用static修飾成員函數,使這個類只存在這一份函數,所有對象共享該函數,不含this指針。
靜態成員是可以獨立訪問的,也就是說,無須創建任何對象實例就可以訪問。base::func(5,3);當static成員函數在類外定義時不需要加static修飾符。
在靜態成員函數的實現中不能直接引用類中非靜態成員,可以引用類中說明的靜態成員。因為靜態成員函數不含this指針。?
不可以同時用const和static修飾成員函數。
C++編譯器在實現const的成員函數的時候為了確保該函數不能修改類的實例的狀態,會在函數中添加一個隱式的參數const this*。但當一個成員為static的時候,該函數是沒有this指針的。也就是說此時const的用法和static是沖突的。
總結:(1)對于數據成員和普通數據可以使用static和const修飾 (2)對于成員函數不可同時使用static和const修飾,因為靜態成員函數不屬于類,沒有this指針。
我們也可以這樣理解:兩者的語意是矛盾的。static的作用是表示該函數只作用在類型的靜態變量上,與類的實例沒有關系;而const的作用是確保函數不能修改類的實例的狀態,與類型的靜態變量沒有關系。因此不能同時用它們。
const的作用:
1.限定變量為不可修改。
2.限定成員函數不可以修改任何數據成員。
用法如下:int?GetCount(void)?const;----在函數末尾加const關鍵字
3.const與指針:
const char *p 和char const *p都表示 指向的內容不能改變。
char * const p,就是將P聲明為常指針,它的地址不能改變,是固定的,但是它的內容可以改變。
總結
以上是生活随笔為你收集整理的C++ static与const用法详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: termux apache php,要啥
- 下一篇: 程序员情人节送这些!