C++ 中 const 和 static 關(guān)鍵字用法及定義
一、static 定義及用途
static 作用: 控制變量的存儲方式和可見性
1、修飾局部變量:
通常局部變量在程序中存放棧區(qū),局部的生命周期在包含語句塊執(zhí)行完時便會結(jié)束,使用 static 關(guān)鍵字對局部變量修飾后,變量會存放靜態(tài)數(shù)據(jù)區(qū),其生命周期會延續(xù)到整個程序結(jié)束。
但是作用域沒有改變,作用域還是限制在其他語句塊中。
個人理解: static 修飾局部變量,可認為是 延長變量生命周期的局部變量(不會隨著函數(shù)結(jié)束而是放)
2、修飾全局變量:
對于一個全局變量,它既可以在本文件中被訪問到,也可以在同一個?程中其它源?件被訪問(添加 extern進?聲明即可)。? static 對全局變量修飾改變了其作用域范圍,由原來的整個?程可?變成了本?件可?。
3、修飾函數(shù):
和全局變量一樣 ,改變作用域,限制在本文件使用。
4、修飾類 :
對類中某函數(shù)修飾,表示該函數(shù)屬于一個類,而不是此類的任何對象 ;
對類中某一個變量修飾 , 便是該變量為所有對象所有,存儲空間中只有一個副本,可以通 過類和對象調(diào)用。
(補充:靜態(tài)非常量數(shù)據(jù)成員,其只能在類外定義和初始化,在類內(nèi)僅是聲明而已。)
樣例如下;
5:類成員/類函數(shù)聲明
函數(shù)體內(nèi) static 變量范圍為該函數(shù)體,不同于 auto 變量,該變量的內(nèi)存只被分配?次,因此其值在下次調(diào)?時仍維持上次的值;
在模塊內(nèi)的 static 全局變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問;
在模塊內(nèi)的 static 函數(shù)只可被這?模塊內(nèi)的其它函數(shù)調(diào)?,這個函數(shù)的使?范圍被限制在聲明它的模塊內(nèi);
在類中的 static 成員變量屬于整個類所擁有,對類的所有對象只有一份拷貝;
在類中的 static 成員函數(shù)屬于整個類所擁有,這個函數(shù)不接收this 指針,因?只能訪問類的static 成員變量。 static類對象必須要在類外進?初始化, static 修飾的變量先于對象存在,所以 static 修飾的變量要在類外初始化;
由于 static 修飾的類成員屬于類,不屬于對象,因此 static 類成員函數(shù)是沒有 this 指針, this 指針是指向本對象的指針,正因為沒有this 指針,所以 static 類成員函數(shù)不能訪問? static 的類成員,只能訪問 static修飾的類成員;
static 成員函數(shù)不能被 virtual 修飾, static 成員不屬于任何對象或?qū)嵗约由?virtual沒有任何實際意義;靜態(tài)成員函數(shù)沒有 this 指針,虛函數(shù)的實現(xiàn)是為每?個對象分配?個 vptr 指針,? vptr 是通過 this 指針調(diào)?的,所以不能為virtual;虛函數(shù)的調(diào)?關(guān)系,this->vptr->ctable->virtual function。
class Person
{
public:
Person(string name,int age)
{
this->m_name = name;
this->m_age = age;
}
//靜態(tài)函數(shù)
static void func()
{
//m_age = 50; 靜態(tài)函數(shù)只能訪問靜態(tài)變量
m_score = 99;
cout << m_score << endl;
}
string m_name;
int m_age;
//靜態(tài)成員變量 類內(nèi)聲明
static int m_score;
};
int Person::m_score = 100; //靜態(tài)變量 類外初始化
int main()
{
Person p1("張三" , 18);
Person p2("李四", 20);
cout << "成績 " << p1.m_score << endl; //通過類對象訪問
p2.m_score = 80; //靜態(tài)變量 只有一個副本,一個內(nèi)存空間
cout<< "成績 " << p2.m_score << endl;
//靜態(tài)函數(shù)調(diào)用
Person::func(); // 通過類調(diào)用
p1.func(); //通過類對象調(diào)用
return 0;
}二、const 定義及用途
const 作用:限制可讀性
1、const修飾基礎(chǔ)數(shù)據(jù)類型
const 在基礎(chǔ)數(shù)據(jù)類型前、后結(jié)果一樣,在使用這些常量的時候不能改變常量的值。修飾符 const 可以?在類型說明符前,也可以用在類型說明符后,其結(jié)果是一樣的。在使用這些常量的時候,只要不改變這些常量的值即可。
const int Max = 100;
int const Min = 1;
void demo()
{
//Max = 110; 常量不可修改
//Min = 2; 常量只讀性
cout << Max << Min << endl;
}2、修飾指針變量和引用變量
如果const 在 * 左側(cè) ,則const修飾指針所指向的變量 ,即指針指向常量
如果const 在 * 右側(cè) ,則const修飾指針本身 ,即指針本身為常量。
int a = 10, b = 20; //使 指針指向常量 (指針指向可改 ,指向的值不可以更改) const int* p1 = &a; p1 = &b; //*p1 = 100; 錯誤用法 //使 指針本身為常量 (指針指向不可改 ,指向的值可以更改) int* const p2 = &b; //p2 = &a; 錯誤用法 *p2 = 100;
3、const 修飾普通函數(shù)
防止傳入的參數(shù)在函數(shù)體內(nèi)被改變,但僅對指針、引用有意義。因為如果是按值傳遞,傳給參數(shù)的僅僅是實參的副本,即使在函數(shù)體內(nèi)改變了形參,實參也不會得到影響。如:
void func(const int i)
{
//i = 10; 不能修改i
cout << i << endl;
}const修飾的函數(shù)參數(shù)是指針時,代表 在函數(shù)體內(nèi)不能修改該指針所指的內(nèi)容,起到保護作用:
void fun(const char * src, char * des)
{
//保護源字符串不被修改,若修改src則編譯出錯。
strcpy(des,src);
}const 修飾函數(shù)返回值
用const來修飾返回的指針或引用,保護指針指向的內(nèi)容或引用的內(nèi)容不被修改。
//const 修飾函數(shù)返回值
const int* getNum(int* a)
{
return a;
}
int a = 10;
auto ret= getNum(&a);
//ret = 20 返回值不能修改4、const 在類中的?法:
const 成員變量,只在某個對象生命周期內(nèi)是常量。對于整個類而言是可以改變的。因為類可以創(chuàng)建多個對象,不同的對象其 const 數(shù)據(jù)成員值可以不同。所以不能在類的聲明中初始化 const 數(shù)據(jù)成員,因為類的對象在沒有創(chuàng)建時候,編譯器不知道 const 數(shù)據(jù)成員的值是什么 const 數(shù)據(jù)成員的初始化只能在類的構(gòu)造函數(shù)的初始化列表中進?。
const 成員函數(shù):
const 成員函數(shù)的主要?的是防?成員函數(shù)修改對象的內(nèi)容。要注意 const 關(guān)鍵字和 static 關(guān)鍵字對于成員函數(shù)來說是不能同時使?的,因為 static 關(guān)鍵字修飾靜態(tài)成員 函數(shù)不含有 this 指針,即不能實例化 const 成員函數(shù)?必須具體到某?個函數(shù)。
常量對象:
常量對象只能調(diào)用常量函數(shù),別的成員函數(shù)都不能調(diào)用。
補充: const 成員函數(shù)中如果實在想修改某個變量,可以使用mutable進行修飾。成員變量中如果想建立在整個類中都恒定的常量,應(yīng)該用類中的枚舉常量來實現(xiàn)或者 static const。
class Person
{
public:
Person(string name,int age)
{
this->m_name = name;
this->m_age = age;
}
//常函數(shù)
void func() const
{
m_sore = 100;
}
//普通成員函數(shù)
void Print()
{
cout << "姓名: " << this->m_name << " 年紀:" << this->m_age << end;
}
string m_name;
int m_age;
mutable int m_sore =60; //特殊變量
};
int main()
{
const Person p("張三", 18); // 常對象
//常對象調(diào)用常函數(shù)
p.func();
//p.Print(); 常對象只能調(diào)用常函數(shù)
p.m_sore = 160; //m_sore 為特殊變量只能在常對象下修改
cout << p.m_sore << endl;
system("pause");
return 0;
}到此這篇關(guān)于C++ 中 const 和 static 關(guān)鍵字用法及定義的文章就介紹到這了,更多相關(guān)C++ const 和 static用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言實現(xiàn)五子棋對戰(zhàn)系統(tǒng)
這篇文章主要為大家詳細介紹了C語言實現(xiàn)五子棋對戰(zhàn)系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05

