首先我們需要一下const關(guān)鍵字的定義,const名叫常量限定符,當(dāng)const修飾變量時(shí),就是在告訴編譯器該變量只可訪問不可修改,而編譯器對(duì)于被const修飾的變量有一個(gè)優(yōu)化,編譯器不會(huì)專門為其開辟空間,而是將變量名和數(shù)值作為一個(gè)kv鍵值對(duì)存入到符號(hào)表中。
注意:const修飾的變量必須要在定義時(shí)初始化
如上,當(dāng)我們想要通過指針改變a時(shí)發(fā)現(xiàn)無法改變,這就是因?yàn)榫幾g器對(duì)其的優(yōu)化,導(dǎo)致a為存入符號(hào)表的一個(gè)固定值,而&a和b的地址一樣只是編譯器想讓我們看到的,實(shí)際上是取地址時(shí),編譯器又開了一塊空間存儲(chǔ)a的值,并將這個(gè)空間地址給b。
?通過volatile關(guān)鍵字修飾變量我們可以告訴編譯器,該變量無需優(yōu)化
如上所示
?一,const常見用法
1.1 const修飾變量
const int a=10;
int const a=10;
const修飾變量如下,該變量無法直接修改,但是可以通過指針進(jìn)行修改
1.2 const修飾指針
const修飾指針以*為界限分為常量指針、指針常量,也就是我們經(jīng)常說的左定值,右定向
常量指針
const在*號(hào)左邊,指針?biāo)赶虻闹禑o法改,但是可以改變指針的指向
指針常量
const在*號(hào)右邊,指針?biāo)赶虻闹悼梢孕薷?,但是無法更改指針的指向
以及兩者共存的情況 ,無法修改指針指向的內(nèi)容,也無法修改指針的指向
1.3 const修飾類成員變量
const修飾類成員變量,該變量必須要在初始化列表初始化,初始化之后該變量無法在更改,即使是構(gòu)造函數(shù)也無法修改
class example
{
public:
example(int a=10)
:_a(a)
{
//_a = 11;//無法修改,會(huì)報(bào)錯(cuò)
}
private:
const int _a;
};
1.4 const修飾類成員函數(shù)
const修飾成員函數(shù)使用格式如下
class example
{
public:
example(int a=10)
:_a(a)
{}
void Example() const;
private:
int _a;
};
實(shí)際上const修飾的是Example成員函數(shù)隱藏的*this指針,因此其實(shí)際修飾格式如下
class example
{
public:
example(int a=10)
:_a(a)
{}
//void Example() const;
void Example(const example* this);
private:
int _a;
};
因此當(dāng)const修飾成員函數(shù)時(shí),該函數(shù)對(duì)于對(duì)象的成員變量只能讀取不能修改
1.5 const修飾函數(shù)返回值
const修飾函數(shù)返回值,則函數(shù)返回值被賦值對(duì)象必須也被const所修飾,通常返回值與引用搭配
const int& example();
const int a=exampel();//正確
int a=example();//錯(cuò)誤
二、const實(shí)戰(zhàn)常用用法解析
2.1 const修飾函數(shù)輸入式參數(shù)
const修飾輸入式參數(shù)指的是,當(dāng)我們函數(shù)的某個(gè)參數(shù)只希望函數(shù)內(nèi)部讀取而不能修改,就可以使用const進(jìn)行修飾
?
例如上面所示,STL庫(kù)中的strcmp函數(shù),比較兩個(gè)字符串是否相等,因此無需對(duì)其進(jìn)行修改,為了保護(hù)參數(shù)就可以用const進(jìn)行修飾
2.2 const修飾類成員函數(shù)
當(dāng)類成員函數(shù)只需訪問類成員變量,如打印成員變量之類,此時(shí)就可以用const修飾,防止誤改成員變量
?
如上圖STL中的vector容器,重載[]訪問數(shù)組元素的接口,就有為了保證成員變量不被改變而const修飾成員函數(shù)的操作
2.3 const修飾函數(shù)返回值
?如上圖所示,注意vector中重載[]的第二個(gè)接口的返回值const_reference,而該類型實(shí)質(zhì)上是const value_type&,注意這個(gè)引用,后面要考。文章來源:http://www.zghlxwxcb.cn/news/detail-720597.html
首先當(dāng)我們選擇引用返回相比于正常返回,中間減少了數(shù)據(jù)拷貝——臨時(shí)變量——數(shù)據(jù)拷貝的過程,有效提升了返回效率。而引用返回也有其弊端,如果用戶修改這個(gè)返回值,那么就會(huì)直接影響容器中對(duì)應(yīng)的值,如果我們不想讓用戶隨意修改容器中的數(shù)據(jù)又想要高效的引用返回,那么就需要用const修飾返回值文章來源地址http://www.zghlxwxcb.cn/news/detail-720597.html
到了這里,關(guān)于C/C++面試常見問題——const關(guān)鍵字的作用和用法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!