欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中const的常見用法詳解

 更新時間:2023年06月12日 16:17:17   作者:Allen.Su  
const名叫常量限定符,用來限定特定變量,以通知編譯器該變量是不可修改的,本文為大家整理了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)文章

最新評論