
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
- 常成員函數(shù)不能調(diào)用非常成員函數(shù)的原因:
是因?yàn)閠his指針的修飾符不同,在const成員函數(shù)里面的this指針被const修飾,在const成員函數(shù)里面調(diào)用非const成員函數(shù)時(shí),相當(dāng)于將const修飾的this指針傳給非const成員函數(shù)。
- 非常成員函數(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里面的成員變量的值
- 非常成員函數(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ù)中修改