C++const常成員

const.png

const關(guān)鍵字在C語言中的應(yīng)用

常類型是指使用類型修飾符const說明的類型,常類型的變量或?qū)ο蟮闹凳遣荒鼙恍薷牡?/p>

const的普通用法

int const index = 10;   //const修飾的變量不能被修改,且必須初始化
const int index = 10;
初始化和賦值
/****初始化****/
int temp = 10;  //定義變量的同時(shí)初始化
/****賦值****/
int temp;
temp = 10;      //給變量賦值

這個(gè)在C語言的基本數(shù)據(jù)類型里面有說過

const修飾指針

常量指針

const修飾 *p

int const *p;   //const修飾 *p
const int* p;   //常量指針 不能通過指針修改p指向的內(nèi)容(不能修改指向的內(nèi)容)
指針常量

const 修飾 p

int temp =10;
int* const p = &temp;  //指針常量 不能修改p的指向 且必須初始化

const用于函數(shù)的形參

void fun(const int *p);

const用于形參時(shí)說明了形參在函數(shù)內(nèi)部不會被改變

const關(guān)鍵字在C++中的應(yīng)用

const修飾成員變量

class TEST
{
    const int m_tmp;  //常成員變量
public:
    TEST() :m_tmp(10)  //相當(dāng)于 const int m_a = 10;
    {
        //m_a = 10; //賦值相當(dāng)于修改值   常變量不能修改
    }
};

常成員變量必須使用初始化列表初始化

const修飾成員函數(shù)

類成員函數(shù)形參表之后,函數(shù)體之前加上const,這樣的函數(shù)成為常函數(shù)

class TEST
{
    int m_money;  
public:
    TEST()  {
         m_money=1000;
    }
    void show() const
    {
        //常成員函數(shù)不能修改變量的值,下面是錯(cuò)誤示范
        //cout << "資產(chǎn):" << m_money++ << endl;
        cout << "資產(chǎn):" << m_money << endl;   //常函數(shù)不能修改變量的值
    }
};
const修飾的是什么?

在C語言里面const是用來修飾變量的,那么在C++里面const是用來修飾什么,在C++中const實(shí)際修飾的是this指針,上面的代碼在編譯器看來是這個(gè)樣子的

class TEST
{
    int m_money;
public:
    TEST(/*TEST* const this*/){
        this->m_money = 100;
    }
    void show(/*const TEST* const this*/) const //修飾this
    {
        cout << "資產(chǎn):" << this->m_money << endl;
    }
};
const修飾成員函數(shù)構(gòu)成重載?

是的沒錯(cuò),構(gòu)成重載,原因是形參不同,構(gòu)成重載

函數(shù)原型相同的成員函數(shù),常版本和非常版本構(gòu)成重載

class TEST
{
    int m_money;  
public:
    TEST()  {
         m_money=1000;
    }
    void show(/*TEST* const this*/) //重載
    {
        cout<< "資產(chǎn):" << m_money++ << endl;
    }
    void show(/*const TEST* const this*/) const
    {
        cout << "const 資產(chǎn):" << m_money << endl;
    }
};
const成員函數(shù)的調(diào)用問題

常成員函數(shù)不能調(diào)用非常成員函數(shù),非常成員函數(shù)可以調(diào)用常成員函數(shù),如果有重載版本的非常函數(shù),優(yōu)先調(diào)用非常函數(shù)

#include<iostream>
using namespace std;
class TEST
{
    int m_money;
public:
    TEST() {
        m_money = 1000;
    }
    /***非常成員函數(shù)可以調(diào)用常成員函數(shù),如果有重載版本的非常函數(shù),優(yōu)先調(diào)用非常函數(shù)***/
    void show(/*TEST* const this*/)
    {
        cout << "資產(chǎn):" << m_money++ << endl;
        fun();
        foo();
    }
    /***********常成員函數(shù)不能調(diào)用非常成員函數(shù)***********/
    void show(/*const TEST* const this*/) const
    {
        cout << "const 資產(chǎn):" << m_money << endl;
        //fun(this);    //錯(cuò)誤原因不能將“this”指針從“const TEST”轉(zhuǎn)換為“TEST &”   
        foo();
    }
    void fun(/*TEST* const this*/)
    {
        cout << "fun" << endl;
    }
    void foo()  const
    {
        cout << "const:fun" << endl;
    }
};
int main()
{
    TEST test;
    test.show();
    return 0;
}
打印結(jié)果:
資產(chǎn):1000
fun
const:fun
  1. 常成員函數(shù)不能調(diào)用非常成員函數(shù)的原因:

是因?yàn)閠his指針的修飾符不同,在const成員函數(shù)里面的this指針被const修飾,在const成員函數(shù)里面調(diào)用非const成員函數(shù)時(shí),相當(dāng)于將const修飾的this指針傳給非const成員函數(shù)。

  1. 非常成員函數(shù)可以調(diào)用常成員函數(shù)的原因:

這個(gè)涉及到編譯器的原理:提高權(quán)限不安全,縮小權(quán)限是安全的

這個(gè)權(quán)限怎么理解:

/***********非常成員函數(shù)***********/
void show()
{   
    //this可讀寫
    cout << "資產(chǎn):" << m_money++ << endl;
    fun();  //調(diào)用非常成員函數(shù) this可讀寫
    foo();  //調(diào)用常成員函數(shù) this可讀
}
/***********常成員函數(shù)***********/
void show() const
{
    //this可讀
    cout << "const 資產(chǎn):" << m_money << endl;
    //fun(this);    //調(diào)用非常成員函數(shù) this可讀寫  
    foo();          //調(diào)用常成員函數(shù) this可讀
}
void fun()
{
    cout << "fun" << endl;
}
void foo()  const
{
    cout << "const:fun" << endl;
}

this可讀寫代表可以訪問和修改this里面的成員變量的值

this可讀代表可以訪問this里面的成員變量的值

  1. 非常成員函數(shù)可以調(diào)用常成員函數(shù),如果有重載版本的非常函數(shù),優(yōu)先調(diào)用非常函數(shù)

這個(gè)從權(quán)限來講,編譯器堅(jiān)定不移的執(zhí)行了不背鍋精神,編譯器認(rèn)為縮小權(quán)限是安全的,擴(kuò)大權(quán)限是危險(xiǎn)的,編譯器會優(yōu)先選擇最合適的

const修飾對象

被const修飾的對象 意味著對象中的成員數(shù)據(jù)不可以改內(nèi)容

  • 常對象不能調(diào)用非常成員函數(shù),只能調(diào)用常函數(shù)
  • 非常對象(普通對象)可以調(diào)用常成員函數(shù)如果有重載版本的非常函數(shù),優(yōu)先非常

原理和const修飾成員函數(shù)的原理是一樣的,理解了const修飾成員函數(shù) 這一部分,那么const修飾對象也很容易理解

關(guān)鍵字 mutable

在C++里面有個(gè)在常成員函數(shù)中開VIP的存在,這就是mutable

mutable int m_money;//mutable修飾的變量可以在常成員函數(shù)中修改
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容