最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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'; //錯誤

當(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)文章

  • C++從一個文件夾中讀出所有txt文件的方法示例

    C++從一個文件夾中讀出所有txt文件的方法示例

    這篇文章主要給大家介紹了關(guān)于C++從一個文件夾中讀出所有txt文件的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • 矩陣的行主序與列主序的分析

    矩陣的行主序與列主序的分析

    這篇文章主要介紹了矩陣的行主序與列主序的分析的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • matlab鳥群算法求解車間調(diào)度問題詳解及實現(xiàn)源碼

    matlab鳥群算法求解車間調(diào)度問題詳解及實現(xiàn)源碼

    這篇文章主要為大家介紹了matlab鳥群算法求解車間調(diào)度的問題分析及實現(xiàn)源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02
  • C語言實現(xiàn)紙牌計算24點小游戲

    C語言實現(xiàn)紙牌計算24點小游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)紙牌計算24點小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 詳解C++ 臨時量與臨時對象及程序的相關(guān)優(yōu)化

    詳解C++ 臨時量與臨時對象及程序的相關(guān)優(yōu)化

    這篇文章主要介紹了C++ 臨時量與臨時對象及程序的相關(guān)優(yōu)化,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 詳解C++ 拷貝構(gòu)造函數(shù)和賦值運算符

    詳解C++ 拷貝構(gòu)造函數(shù)和賦值運算符

    本文主要介紹了拷貝構(gòu)造函數(shù)和賦值運算符的區(qū)別,以及在什么時候調(diào)用拷貝構(gòu)造函數(shù)、什么情況下調(diào)用賦值運算符。最后,簡單的分析了下深拷貝和淺拷貝的問題。有需要的朋友可以看下
    2016-12-12
  • 解析內(nèi)存對齊 Data alignment: Straighten up and fly right的詳解

    解析內(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ū)別詳解

    以下是對static_cast,dynamic_cast,reinterpret_cast和const_cast之間的區(qū)別進行了詳細的介紹,需要的朋友可以過來參考下
    2013-09-09
  • C語言實現(xiàn)學(xué)生宿舍信息管理系統(tǒng)

    C語言實現(xiàn)學(xué)生宿舍信息管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)學(xué)生宿舍信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言之函數(shù)遞歸的實現(xiàn)

    C語言之函數(shù)遞歸的實現(xiàn)

    本文主要介紹了C語言之函數(shù)遞歸的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評論

鄂伦春自治旗| 德庆县| 资中县| 开原市| 安岳县| 天津市| 灵丘县| 木里| 临城县| 望都县| 台湾省| 成武县| 罗定市| 长沙市| 句容市| 南投县| 龙胜| 行唐县| 安泽县| 合阳县| 永川市| 铁力市| 突泉县| 邵武市| 墨江| 枝江市| 贵德县| 济南市| 华坪县| 红河县| 灵璧县| 拉孜县| 北京市| 客服| 新干县| 桂东县| 微山县| 介休市| 鄯善县| 怀远县| 西昌市|