c++ const static
const作用:
1.定義常量,可以保護被修飾的東西,防止意外的修改,增強程序的健壯性。? ??
const int Max = 100;?
void f(const int i) { i=10;//error! }
??????//如果在函數體內修改了i,編譯器就會報錯
?
2.便于進行類型檢查
const常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查,而對后者只進行字符替換,沒有類型安全檢查,并且在字符替換時可能會產生意料不到的錯誤。
3.可以很方便地進行參數的調整和修改,同宏定義一樣,一變都變。
4.可以節省空間,避免不必要的內存分配
const定義常量從匯編的角度來看,只是給出了對應的內存地址,而不是象#define一樣給出的是立即數,所以,const定義的常量在程序運行過程中只有一份拷貝,而#define定義的常量
在內存中有若干個拷貝。
define PI 3.14159?????????//常量宏
const doulbe??Pi=3.14159;??//此時并未將Pi放入ROM中
??????????????......
double i=Pi;???//此時為Pi分配內存,以后不再分配!
double I=PI;??//編譯期間進行宏替換,分配內存
double j=Pi;??//沒有內存分配
double J=PI;??//再進行宏替換,又一次分配內存!
5.提高了效率。編譯器通常不為普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率也很高
?
?
const使用:
1.定義常量:const修飾變量,以下兩種定義形式在本質上是一樣的。它的含義是:const修飾的類型為TYPE的變量value是不可變的。
? TYPE const ValueName = value;?
????? const TYPE ValueName = value;
2.指針使用const:
char* const pContent;??指針本身是常量不可變
const char *pContent;??指針所指向的內容是常量不可變
3.函數中使用const:
const修飾函數參數
a.傳遞過來的參數在函數內不可以改變(無意義,因為Var本身就是形參)
void function(const int Var);
b.參數指針所指內容為常量不可變
void function(const char* Var);
c.參數指針本身為常量不可變(也無意義,因為char* Var也是形參)
void function(char* const Var);
d.參數為引用,為了增加效率同時防止修改。修飾引用參數時:
void fun(A a);
void fun(A const &a);
第一個函數效率低。函數體內產生A類型的臨時對象用于復制參數a,臨時對象的構造、復制、析構過程都將消耗時間。而第二個函數直接傳遞地址,“引用傳遞”不需要
產生臨時對象,節省了臨時對象的構造、復制、析構過程消耗的時間,提高了效率。但光用引用有可能改變a,所以加上const。
?4.類相關const:
(1)const修飾成員變量
const修飾類的成員函數,表示成員常量,不能被修改,同時它只能在初始化列表中賦值。
????class A
????{?
? ??????…
? ??????const int nValue; ? ? ? ??//成員常量不能被修改
? ??????…
? ??????A(int x): nValue(x) { } ;?//只能在初始化列表中賦值
?????}?
(2)const修飾成員函數
const修飾類的成員函數,則該成員函數不能修改類中任何非const成員函數。一般寫在函數的最后來修飾。
????class A
????{?
? ??????…
???????void function()const;?//常成員函數,?它不改變對象的成員變量.????????????????????????
//也不能調用類中任何非const成員函數。
}
對于const類對象/指針/引用,只能調用類的const成員函數,因此,const修飾成員函數的最重要作用就是限制對于const對象的使用。
a. const成員函數不被允許修改它所在對象的任何一個數據成員。
b. const成員函數能夠訪問對象的const成員,而其他成員函數不可以。
?
(3)const修飾類對象/對象指針/對象引用
const修飾類對象表示該對象為常量對象,其中的任何成員都不能被修改。對于對象指針和對象引用也是一樣。
const修飾的對象,該對象的任何非const成員函數都不能被調用,因為任何非const成員函數會有修改成員變量的企圖。
例如:
class AAA
{?
? ? void func1();?
void func2() const;?
}?
const AAA aObj;?
aObj.func1();?×
aObj.func2();?正確
?
https://www.cnblogs.com/JiFfeiYu/p/6697195.html
?
?
static:
1.為什么設計static?
考慮下面的需求:在程序運行過程中,在一個范圍內,有一個對象大家共享,而且可以多次使用,狀態能夠保持,對象的生命周期一直持續到程序運行結束。函數內部定義的變量,在程序執行到它的定義處時,編譯器為它在棧上分配空間,大家知道,函數在棧上分配的空間在此函數執行結束時會釋放掉,這樣就產生了一個問題:?如果想將函數中此變量的值保存至下一次調用時,如何實現? 最容易想到的方法是定義一個全局的變量,但定義為一個全局變量有許多缺點,最明顯的缺點是破壞了此變量的訪問范圍(使得在此函數中定義的變量,不僅僅受此函數控制)。
2.什么時候用static? 需要一個數據對象為整個類而非某個對象服務,同時又力求不破壞類的封裝性,即要求此成員隱藏在類的內部,對外不可見。
3.作用:
a.作用域隱藏。當一個工程有多個文件的時候,用static修飾的函數或變量只能夠在本文件中可見,文件外不可見
b.全局生命周期。用static修飾的變量或函數生命周期是全局的。被static修飾的變量存儲在靜態數據區(全局數據區),程序運行期間,不能釋放,一直到程序終止。
c.static修飾的變量默認初始化為0且只初始化一次
d.可以節省內存。static修飾的變量或函數是屬于類的,所有對象公有,只有一份拷貝。
因此,不能夠將靜態函數設置為虛函數。注意:1.靜態數據成員的值對每個對象都是一樣,但它的值是可以更新的。某個類的實例只要對靜態數據成員的值更新一次,所有對象存取更新后的相同的值,這樣可以提高時間效率。
2.在類中的static成員函數屬于整個類所擁有,這個函數不接收this指針,因而只能訪問類的static成員,也就是靜態變量和靜態函數
3.static類對象必須要在類外進行初始化
class Text {public:static int count; };int Text::count=0;//用static成員變量必須要初始化 int main() {Text t1;cout<<t1.count<<endl; return 0; }4.靜態成員之間可以相互訪問,包括靜態成員函數訪問靜態數據成員和訪問靜態成員函數;非靜態成員函數可以任意地訪問靜態成員函數和靜態數據成員;?靜態成員函數不能訪問非靜態成員函數和非靜態數據成員;?
const static:
class A { public:A():m(10) //const成員必須在構造函數的初始化構造列表中初始化 {q = 40;}void fun1()const{m++; //錯誤。const成員是常量,不能改變其值。n++; //正確。static變量n屬于類,但是每個對象的函數都可以訪問和改變它。q++; //錯誤。const成員函數不能改變數據成員的值。 }static void fun2(){m++; //錯誤。const成員是常量,不能改變其值。n++; //正確。static成員函數可以訪問和改變static變量的值。q++; //錯誤。static成員函數不能訪問和改變非static數據成員的值。 }const int m;static int n;static const int p;int q; };int A::n = 5; //static 成員必須在類外初始化,此時不用加關鍵字static,但是要指定類作用域 A:: const int A::p = 30; //static const 成員跟static成員一樣在類外初始化(而不是在構造函數初始化列表中),記得加上關鍵字const1.C++中,const成員不能在類定義處初始化,只能通過構造函數初始化列表進行,并且必須有構造函數
2.static 成員必須在類外初始化
3.static const 成員跟static成員一樣在類外初始化(而不是在構造函數初始化列表中),記得加上關鍵字const
4.static表示的是靜態的。類的靜態成員函數、靜態成員變量是和類相關的,而不是和類的具體對象相關的。
轉載于:https://www.cnblogs.com/ymjyqsx/p/9728789.html
總結
以上是生活随笔為你收集整理的c++ const static的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络编程—网络基础概览、socket,T
- 下一篇: MVC架构中的Repository模式