C++ const 常量完整用法詳解
const 用于修飾只讀對(duì)象,被修飾后值不可修改,有類型、作用域,是 C++ 主力常量用法。下面分場(chǎng)景逐一講解。
一、基礎(chǔ):修飾普通變量(常量變量)
1. 基本語(yǔ)法
const 類型 變量名 = 初始值;
強(qiáng)制要求:必須初始化,定義后不能再賦值修改。
#include <iostream>
using namespace std;
int main()
{
const int num = 100;
const double pi = 3.14159;
// num = 200; // 編譯報(bào)錯(cuò):const 只讀,無(wú)法修改
cout << num << " " << pi << endl;
return 0;
}2. 作用域規(guī)則
- 局部 const:定義在函數(shù)/代碼塊內(nèi),僅當(dāng)前作用域有效。
- 全局 const:默認(rèn)僅當(dāng)前源文件可見(內(nèi)部鏈接),和普通全局變量不同。
- 若要跨文件使用,加
extern:
- 若要跨文件使用,加
// 文件A.cpp extern const int g_val = 10; // 文件B.cpp extern const int g_val; // 聲明,可使用
3. 用變量初始化 const
const 可以是運(yùn)行時(shí)常量,允許用普通變量初始化:
int a = 20; const int b = a; // 合法,運(yùn)行時(shí)確定值
二、重點(diǎn):const + 指針(三大組合,高頻考點(diǎn))
根據(jù) const 位置不同,含義完全不同,分三類記憶。
1. 常量指針(const修飾指向的內(nèi)容)
格式:const 類型* 指針名
- 指針本身可以改指向
- 指針指向的數(shù)據(jù)不能修改
int x = 1, y = 2; const int* p = &x; p = &y; // ? 指針指向可以變 // *p = 100; // ? 指向的值不能修改
2. 指針常量(const修飾指針本身)
格式:類型* const 指針名
- 指針本身不能改指向(必須初始化)
- 指針指向的數(shù)據(jù)可以修改
int x = 1; int* const p = &x; // 定義時(shí)必須初始化 *p = 100; // ? 內(nèi)容可改 // p = &y; // ? 指針指向不能變
3. 雙重 const(內(nèi)容、指針都只讀)
格式:const 類型* const 指針名
- 指針指向 不能改
- 指向的數(shù)據(jù) 不能改
int x = 1; const int* const p = &x; // *p = 100; ? // p = &y; ?
快速判斷技巧:看
const靠近誰(shuí),誰(shuí)就不能改。
三、const 修飾引用
引用本身等價(jià)于變量別名,const 修飾引用表示不能通過引用修改原數(shù)據(jù)。
格式:const 類型& 引用名
int a = 10; const int& r = a; // r = 20; // ? 不能通過引用修改 a a = 20; // ? 原變量本身可以修改
常用場(chǎng)景:函數(shù)傳參,避免拷貝 + 保護(hù)數(shù)據(jù)。
四、const 修飾函數(shù)(分:參數(shù)、返回值、成員函數(shù))
1. 修飾函數(shù)形參
目的:保護(hù)實(shí)參不被函數(shù)修改,推薦搭配引用/指針使用,減少拷貝。
// 不允許修改傳入的字符串
void print(const string& s)
{
cout << s << endl;
// s = "test"; 報(bào)錯(cuò)
}
2. 修飾函數(shù)返回值
一般用于返回指針/引用,防止外部修改返回的內(nèi)容:
const int& getVal(int& a)
{
return a;
}
int main()
{
int x = 10;
const int& res = getVal(x);
// res = 20; 報(bào)錯(cuò)
return 0;
}普通值返回加 const 無(wú)意義。
3. 修飾類的成員函數(shù)(類專屬用法)
const 寫在函數(shù)參數(shù)列表后面,表示:
該函數(shù)不會(huì)修改類的任何成員變量,也不能調(diào)用非 const 成員函數(shù)。
語(yǔ)法:
返回值 函數(shù)名(參數(shù)) const;
示例:
class Test
{
private:
int num = 10;
public:
// const 成員函數(shù)
void show() const
{
cout << num << endl;
// num = 20; ? 不能修改成員變量
}
};規(guī)則:
const成員函數(shù)內(nèi),禁止修改成員變量。const對(duì)象只能調(diào)用const成員函數(shù)。const成員函數(shù)不能調(diào)用普通(非 const)成員函數(shù)。
五、const 修飾類成員變量
類內(nèi) const 成員變量,必須在構(gòu)造函數(shù)初始化列表初始化,不能在構(gòu)造函數(shù)體內(nèi)賦值。
class A
{
private:
const int val; // const 成員
public:
// 只能在初始化列表賦值
A() : val(100)
{
// val = 100; ? 體內(nèi)賦值報(bào)錯(cuò)
}
};六、補(bǔ)充:const 與 類型轉(zhuǎn)換、const _cast
- const 變量不能直接轉(zhuǎn)普通變量,強(qiáng)行修改屬于未定義行為。
- 若臨時(shí)需要去除只讀屬性,可用
const_cast(謹(jǐn)慎使用):
const int a = 10; int* p = const_cast<int*>(&a); *p = 20; // 不推薦,修改原 const 常量是未定義行為
七、const 總結(jié)速記
- 普通變量:
const 類型 變量 = 值,只讀不可改。 - 指針:
const T*:內(nèi)容不可改,指針可改T* const:指針不可改,內(nèi)容可改const T* const:全都不可改
- 引用:
const T&,禁止通過引用改原數(shù)據(jù)。 - 函數(shù)參數(shù):
const保護(hù)實(shí)參,優(yōu)先引用傳參。 - 類成員函數(shù):尾部加
const,承諾不修改成員。 - 類 const 成員變量:必須在初始化列表初始化。
到此這篇關(guān)于C++ const 常量完整用法詳解的文章就介紹到這了,更多相關(guān)C++ const 常量用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)BMP圖像開運(yùn)算處理
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)BMP圖像開運(yùn)算處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
使用C++制作簡(jiǎn)單的web服務(wù)器(續(xù))
本文承接上文《使用C++制作簡(jiǎn)單的web服務(wù)器》,把web服務(wù)器做的功能稍微強(qiáng)大些,主要增加的功能是從文件中讀取網(wǎng)頁(yè)并返回給客戶端,而不是把網(wǎng)頁(yè)代碼寫死在代碼中,有需要的小伙伴來參考下吧。2015-03-03
詳解C語(yǔ)言中的錯(cuò)誤報(bào)告errno與其相關(guān)應(yīng)用方法
這篇文章主要介紹了C語(yǔ)言中的錯(cuò)誤報(bào)告errno與其相關(guān)應(yīng)用方法,包括errno和strerror以及perror的介紹,需要的朋友可以參考下2015-08-08
C語(yǔ)言中讀寫交替時(shí)出現(xiàn)的問題分析
讀寫命令交替,一定要使用fseek重新定位,否則出現(xiàn)輸入顯示混亂,這篇文章主要介紹了C語(yǔ)言中讀寫交替時(shí)出現(xiàn)的問題分析,需要的朋友可以參考下2022-12-12
C++ vector容器實(shí)現(xiàn)貪吃蛇小游戲
這篇文章主要為大家詳細(xì)介紹了C++ vector容器實(shí)現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02
C語(yǔ)言 表、棧和隊(duì)列詳解及實(shí)例代碼
這篇文章主要介紹了C語(yǔ)言 表、棧和隊(duì)列詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02

