C++中const的常見用法詳解
一、聲明帶const
1、const int a
(1)表示常量a,不能改變a的值
//不能改變p的值 const char p = 'f';
2、const int &a
(1)表示常量引用,a代表的內(nèi)容不能修改
int i = 100; const int &a = i; //表示a所代表的內(nèi)容不能被修改 const int &b = 156; //可以,字面值初始化常量引用 int &c = 156; //錯誤 b = 157; //錯誤,b看成常量,值不能修改
3、const char *p & char const *p
(1)'char const *p;'等價于'const char *p;'
(2)表示常量指針(p所指向的內(nèi)容不能通過p來修改):
char str[] = "I Love China"; char *p; p = str; *p = 'Y'; p++; //p可以指向不同的位置,只要這些位置的內(nèi)存歸我們管即可
如果將p的定義修改為:
const char *p; //表示常量指針(p所指向的內(nèi)容不能通過p來修改) *p = 'Y'; //錯誤
當(dāng)然,通過str修改內(nèi)容則沒有問題:
str[0] = 'Y';
4、char * const p
(1)表示指針常量(p不可以指向其他內(nèi)容):
看如下范例:
char str[] = "I Love China"; char * const p = str; //定義的時候必須初始化 p++; //這里不可以,p指向一個內(nèi)容后,不可以指向其他內(nèi)容(p不可以指向不同目標(biāo)) *p = 'Y'; //但可以修改指向的目標(biāo)的內(nèi)容
5、const char * const p & char const * const p
(1)'const char * const p;'等價于'char const * const p;'
(2)表示p的指向不能改變,p指向的內(nèi)容也不能通過p來改變。
二、函數(shù)形參帶const
1、函數(shù)形參帶const的 - 使用
struct student {int num};
void fs(student &stu){
stu.num = 1010;
}
student abc;
abc.num = 100;
fs(abc);
std::cout << abc.num << std::endl; //1010上面這段代碼,可以注意到,在fs()函數(shù)中可以修改stu里的num成員,修改后,該值會被帶回到主調(diào)函數(shù)中,也就是說,fs()函數(shù)中對形參stu的修改實際就是對實參abc的修改,因為這里形參采用的是引用類型。
如果不希望在函數(shù)fs中修改形參stu里的值,建議形參最好使用常量引用的習(xí)慣。
void fs(const student &stu){
stu.num = 1010; //這句就錯誤了,不能修改stu中的內(nèi)容
}再繼續(xù)看范例:
void fs(const int i){ //實參可以是正常的int,形參可以使用const int接,這都沒問題
i = 100; //這也不行,不能給常量賦值
}2、函數(shù)形參帶const的 - 好處
(1)可以防止無意中修改了形參值導(dǎo)致實參值被無意中修改掉。
(2)實參類型可以更加靈活。
struct student {int num};
void fs(student &stu){
}
student abc;
abc.num = 100;
const student& def = abc;
fs(def);//錯誤,因為def類型是const&,而函數(shù)fs的形參不帶const
std::cout << abc.num << std::endl; //1010如果改成:
void fs(const student &stu){
}可以看到const student &stu這種類型的形參可以接受的實參類型更多樣化,可以接收普通的引用作為實參,也可以接收常量引用作為實參。
再繼續(xù)看看如下范例:
void func2(int &a);//定義函數(shù)func2() func2(156);//不可以,必須傳遞進去一個變量
修改后:
void func2(const int &a);//定義函數(shù)func2() func2(156);//可以,可以船進去一個常量
三、成員函數(shù)末尾帶const
成員函數(shù)末尾加const起什么作用呢?表示該成員函數(shù)不會修改該對象里面的任何成員變量的值。
這種在末尾加了一個const的成員函數(shù)也稱常量成員函數(shù)。
class Persion{
public:
void Get() const{
a_ += 10; //錯誤,常量成員函數(shù)不可以修改成員變量的值
}
void Add(int x){
a_ = a_ - x ;
}
private:
int a_;
}從上面的代碼看,如果在Get的成員函數(shù)中修改成員變量a_的值,是不被允許的。
看看如下范例:
// 定義const對象,這種對象有限制 const Persion per; // 不可以,Add成員函數(shù)是非const的,只能被非const的對象調(diào)用 per.Add(14); // 可以因為Get()的成員函數(shù)是const per.Get();
Persion per2; //Get是const成員函數(shù),則不管是cosnt對象還是非const對象都可以調(diào)用const員函數(shù) //而非const得成員函數(shù)不能被const對象調(diào)用,只能被非const對象調(diào)用 per2.Add();
總結(jié)一下:
(1)const成員函數(shù),則不管是cosnt對象還是非const對象都可以調(diào)用const員函數(shù)。
(2)而非const得成員函數(shù)不能被const對象調(diào)用,只能被非const對象調(diào)用。
(3)普通函數(shù)(非成員函數(shù))末尾是不能加const, 編譯都無法通過。
四、const的克星mutable
mutable,翻譯成中文不穩(wěn)定的、容易改變的意思。與const正好是反義詞。而且mutable的引入也正是為了突破const的限制。
剛剛已經(jīng)看到,在末尾有const修飾的成員函數(shù)中,是不允許修改成員變量值的。那在設(shè)計類成員變量的時候,假如確實遇到了需要在const結(jié)尾的成員函數(shù)中希望修改成員變量值的需求,怎么辦呢?
也許有人會說,那就把函數(shù)末尾的const去掉,變成一個非const的成員函數(shù)。那就會引入一個新問題,如果這個成員函數(shù)從const變成一個非const的了,那么就不能被const對象調(diào)用。
所以,引入了mutable修飾符(關(guān)鍵字)來修飾一個成員變量。一個成員變量一旦被mutable所修飾,就表示這個成員變量永遠處于可變的狀態(tài),即使在以const結(jié)尾的成員函數(shù)中。
看如下范例:
class Persion{
public:
void Get() const{
a_ += 10; //可以修改成員變量a_了
}
void Add(int x){
a_ = a_ - x ;
}
private:
mutable int a_;
}到此這篇關(guān)于C++中const的常見用法詳解的文章就介紹到這了,更多相關(guān)C++ const內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
matlab鳥群算法求解車間調(diào)度問題詳解及實現(xiàn)源碼
這篇文章主要為大家介紹了matlab鳥群算法求解車間調(diào)度的問題分析及實現(xiàn)源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-02-02
詳解C++ 臨時量與臨時對象及程序的相關(guān)優(yōu)化
這篇文章主要介紹了C++ 臨時量與臨時對象及程序的相關(guān)優(yōu)化,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
解析內(nèi)存對齊 Data alignment: Straighten up and fly right的詳解
對于所有直接操作內(nèi)存的程序員來說,數(shù)據(jù)對齊都是很重要的問題.數(shù)據(jù)對齊對你的程序的表現(xiàn)甚至能否正常運行都會產(chǎn)生影響2013-05-05
static_cast,dynamic_cast,reinterpret_cast和const_cast的區(qū)別詳解
以下是對static_cast,dynamic_cast,reinterpret_cast和const_cast之間的區(qū)別進行了詳細的介紹,需要的朋友可以過來參考下2013-09-09
C語言實現(xiàn)學(xué)生宿舍信息管理系統(tǒng)
這篇文章主要為大家詳細介紹了C語言實現(xiàn)學(xué)生宿舍信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03

