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'; //錯誤
當然,通過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不可以指向不同目標) *p = 'Y'; //但可以修改指向的目標的內(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里的值,建議形參最好使用常量引用的習慣。
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)文章
C語言從txt文件中逐行讀入數(shù)據(jù)存到數(shù)組中的實現(xiàn)方法
下面小編就為大家?guī)硪黄狢語言從txt文件中逐行讀入數(shù)據(jù)存到數(shù)組中的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12Sublime Text 3 實現(xiàn)C++代碼的編譯和運行示例
下面小編就為大家?guī)硪黄猄ublime Text 3 實現(xiàn)C++代碼的編譯和運行示例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09C++中用兩個標準容器stack,實現(xiàn)一個隊列的方法詳解
本篇文章是對C++中使用兩個標準容器stack,實現(xiàn)一個隊列的方法進行了詳細的分析介紹,需要的朋友參考下2013-05-05C++/Php/Python/Shell 程序按行讀取文件或者控制臺的實現(xiàn)
下面小編就為大家?guī)硪黄狢++/Php/Python/Shell 程序按行讀取文件或者控制臺的實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03C++訪問Redis的mset 二進制數(shù)據(jù)接口封裝方案
這篇文章主要介紹了C++訪問Redis的mset 二進制數(shù)據(jù)接口封裝方案的相關(guān)資料,需要的朋友可以參考下2015-07-07