系列文章目錄
C++高性能優(yōu)化編程系列
深入理解軟件架構設計系列
高級C++并發(fā)線程編程
C++技能系列
期待你的關注哦?。?!
生活就是上帝發(fā)給你的一張手牌,無論多爛,你都得拿著。
Life is god give you a hand, no matter how bad, you have to take.
一、聲明帶const
1、const int a
(1)表示常量a,不能改變a的值
//不能改變p的值
const char p = 'f';
2、const int &a
(1)表示常量引用,a代表的內容不能修改
int i = 100;
const int &a = i; //表示a所代表的內容不能被修改
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所指向的內容不能通過p來修改):
char str[] = "I Love China";
char *p;
p = str;
*p = 'Y';
p++; //p可以指向不同的位置,只要這些位置的內存歸我們管即可
如果將p的定義修改為:
const char *p; //表示常量指針(p所指向的內容不能通過p來修改)
*p = 'Y'; //錯誤
當然,通過str修改內容則沒有問題:
str[0] = 'Y';
4、char * const p
(1)表示指針常量(p不可以指向其他內容):
看如下范例:文章來源:http://www.zghlxwxcb.cn/news/detail-505247.html
char str[] = "I Love China";
char * const p = str; //定義的時候必須初始化
p++; //這里不可以,p指向一個內容后,不可以指向其他內容(p不可以指向不同目標)
*p = 'Y'; //但可以修改指向的目標的內容
5、const char * const p & char const * const p
(1)'const char * const p;'等價于'char const * const p;'
(2)表示p的指向不能改變,p指向的內容也不能通過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成員,修改后,該值會被帶回到主調函數(shù)中,也就是說,fs()函數(shù)中對形參stu的修改實際就是對實參abc的修改,因為這里形參采用的是引用類型。
如果不希望在函數(shù)fs中修改形參stu里的值,建議形參最好使用常量引用的習慣。
void fs(const student &stu){
stu.num = 1010; //這句就錯誤了,不能修改stu中的內容
}
再繼續(xù)看范例:
void fs(const int i){ //實參可以是正常的int,形參可以使用const int接,這都沒問題
i = 100; //這也不行,不能給常量賦值
}
2、函數(shù)形參帶const的 - 好處
(1)可以防止無意中修改了形參值導致實參值被無意中修改掉。
(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的對象調用
per.Add(14);
// 可以因為Get()的成員函數(shù)是const
per.Get();
Persion per2;
//Get是const成員函數(shù),則不管是cosnt對象還是非const對象都可以調用const員函數(shù)
//而非const得成員函數(shù)不能被const對象調用,只能被非const對象調用
per2.Add();
總結一下:
(1)const成員函數(shù),則不管是cosnt對象還是非const對象都可以調用const員函數(shù)。
(2)而非const得成員函數(shù)不能被const對象調用,只能被非const對象調用。
(3)普通函數(shù)(非成員函數(shù))末尾是不能加const, 編譯都無法通過。
四、const的克星mutable
mutable
,翻譯成中文不穩(wěn)定的、容易改變的意思。與const
正好是反義詞。而且mutable的引入也正是為了突破const
的限制。
剛剛已經(jīng)看到,在末尾有const
修飾的成員函數(shù)中,是不允許修改成員變量值的。那在設計類成員變量的時候,假如確實遇到了需要在const
結尾的成員函數(shù)中希望修改成員變量值的需求,怎么辦呢?
也許有人會說,那就把函數(shù)末尾的const
去掉,變成一個非const
的成員函數(shù)。那就會引入一個新問題,如果這個成員函數(shù)從const
變成一個非const
的了,那么就不能被const
對象調用。
所以,引入了mutable修飾符(關鍵字)來修飾一個成員變量。一個成員變量一旦被mutable所修飾,就表示這個成員變量永遠處于可變的狀態(tài),即使在以const結尾的成員函數(shù)中。
看如下范例:
class Persion{
public:
void Get() const{
a_ += 10; //可以修改成員變量a_了
}
void Add(int x){
a_ = a_ - x ;
}
private:
mutable int a_;
}
五、小結
開發(fā)中經(jīng)常使用,面試中也是經(jīng)常被問的,所以謹記于心。文章來源地址http://www.zghlxwxcb.cn/news/detail-505247.html
到了這里,關于C++技能系列 ( 2 ) - const的幾種使用【詳解】的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!