the different between Const and Static in C++
1.const規(guī)定了一個變量在它初始化值之后,值不能再改變,也就是只讀。
來看個例子:
const測試例子
在這個測試程序里,我試圖在初始化變量c的值之后再修改c的值,編譯直接報錯,告訴我c已經(jīng)是一個只讀變量了,不可以改值。
?
2.static在函數(shù)內的時候,表明這個變量在函數(shù)的生命周期結束之后也不會被釋放。
static使用測試
在第一次調用test()時,如果static int b沒有被我賦初值,也會被默認賦值成0。然后執(zhí)行自增運算,所以輸出1。第二次調用test()時如果是普通的變量,則會被重新分配內存,但static類型的變量上次執(zhí)行test函數(shù)之后沒有被釋放,而是保存在全局變量區(qū),所以繼續(xù)加一變成2。
對比一下非static的變量會怎樣:
3.static在函數(shù)外的時候,表明這個變量的作用域只在該.c文件里,不能作用于整個工程。
static
- static局部變量 將一個變量聲明為函數(shù)的局部變量,那么這個局部變量在函數(shù)執(zhí)行完成之后不會被釋放,而是繼續(xù)保留在內存中
- static 全局變量 表示一個變量在當前文件的全局內可訪問
- static 函數(shù) 表示一個函數(shù)只能在當前文件中被訪問
- static 類成員變量 表示這個成員為全類所共有
- static 類成員函數(shù) 表示這個函數(shù)為全類所共有,而且只能訪問靜態(tài)成員變量
const
- const 常量:定義時就初始化,以后不能更改。
- const 形參:func(const int a){};該形參在函數(shù)里不能改變
- const修飾類成員函數(shù):該函數(shù)對成員變量只能進行只讀操作
?
在函數(shù)后加const的意義:
我們定義的類的成員函數(shù)中,常常有一些成員函數(shù)不改變類的數(shù)據(jù)成員,也就是說,這些函數(shù)是"只讀"函數(shù),而有一些函數(shù)要修改類數(shù)據(jù)成員的值。如果把不改變數(shù)據(jù)成員的函數(shù)都加上const關鍵字進行標識,顯然,可提高程序的可讀性。其實,它還能提高程序的可靠性,已定義成const的成員函數(shù),一旦企圖修改數(shù)據(jù)成員的值,則編譯器按錯誤處理。?const成員函數(shù)和const對象 實際上,const成員函數(shù)還有另外一項作用,即常量對象相關。對于內置的數(shù)據(jù)類型,我們可以定義它們的常量,用戶自定義的類也一樣,可以定義它們的常量對象。
1、非靜態(tài)成員函數(shù)后面加const(加到非成員函數(shù)或靜態(tài)成員后面會產(chǎn)生編譯錯誤)
2、表示成員函數(shù)隱含傳入的this指針為const指針,決定了在該成員函數(shù)中, 任意修改它所在的類的成員的操作都是不允許的(因為隱含了對this指針的const引用);
3、唯一的例外是對于mutable修飾的成員。 加了const的成員函數(shù)可以被非const對象和const對象調用,但不加const的成員函數(shù)只能被非const對象調用
const成員函數(shù)主要目的是防止成員函數(shù)修改對象的內容。即const成員函數(shù)不能修改成員變量的值,但可以訪問成員變量。當方法成員函數(shù)時,該函數(shù)只能是const成員函數(shù)。
static成員函數(shù)主要目的是作為類作用域的全局函數(shù)。不能訪問類的非靜態(tài)數(shù)據(jù)成員。類的靜態(tài)成員函數(shù)沒有this指針,這導致:1、不能直接存取類的非靜態(tài)成員變量,調用非靜態(tài)成員函數(shù)2、不能被聲明為virtual
1、函數(shù)前后const
函數(shù)前const:普通函數(shù)或成員函數(shù)(非靜態(tài)成員函數(shù))前均可加const修飾,表示函數(shù)的返回值為const,不可修改。格式為:
const returnType functionName(param list)
函數(shù)后加const:只有類的非靜態(tài)成員函數(shù)后可以加const修飾,表示該類的this指針為const類型,不能改變類的成員變量的值,即成員變量為read only(例外情況見2),任何改變成員變量的行為均為非法。此類型的函數(shù)可稱為只讀成員函數(shù),格式為:
returnType functionName(param list) const
說明:類中const(函數(shù)后面加)與static不能同時修飾成員函數(shù),原因有以下兩點①C++編譯器在實現(xiàn)const的成員函數(shù)時,為了確保該函數(shù)不能修改類的實例狀態(tài),會在函數(shù)中添加一個隱式的參數(shù)const this*。但當一個成員為static的時候,該函數(shù)是沒有this指針的,也就是說此時const的用法和static是沖突的;
②兩者的語意是矛盾的。static的作用是表示該函數(shù)只作用在類型的靜態(tài)變量上,與類的實例沒有關系;而const的作用是確保函數(shù)不能修改類的實例的狀態(tài),與類型的靜態(tài)變量沒有關系,因此不能同時用它們。
前面使用const?表示返回值為const
后面加const表示函數(shù)不可以修改class的成員
2、const與mutable的區(qū)別
從字面意思知道,mutalbe是“可變的,易變的”,跟constant(既C++中的const)是反義詞。在C++中,mutable也是為了突破const的限制而設置的。被mutable修飾的變量(成員變量)將永遠處于可變的狀態(tài),即使在一個const函數(shù)中。因此,后const成員函數(shù)中可以改變類的mutable類型的成員變量。
?
#include <iostream>
using namespace std;class A{
private:int m_a;//int前加mutable關鍵字修飾即可編譯通過
public:A():m_a(0){}int setA(int a) const{this->m_a = a;//error: l-value specifies const object}int setA(int a){this->m_a = a;}
};int main()
{A a1;return 0;
}
編譯錯誤:error C2166: l-value specifies const object,左值為const,即const修飾后成員函數(shù)中的this指針為const,它所指向的成員變量不能被修改,將成員變量用mutable修飾后編譯通過。
https://blog.csdn.net/lp10031312/article/details/79512165
https://www.cnblogs.com/Jinfeng1213/p/8597446.html
https://blog.csdn.net/gorgeous_mj/article/details/90574796
總結
以上是生活随笔為你收集整理的the different between Const and Static in C++的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Error:CPACK_PACKAGE_
- 下一篇: VS+Eigen+CUDA compil