1. const是一種類型修飾符,用于說明永不改變的對象,const對象一旦定義就無法再改變,所以const對象必須初始化。
2.頂層const與底層const區(qū)別
位于*左側(cè)為底層const,位于*右側(cè)為頂層const
頂層const意味著內(nèi)存本身存儲(chǔ)的數(shù)據(jù)是常量,
如int const a = 3;
即變量a是常量,不可改變。a = 5;//error
如int const *pa = &a;
即pa所指向內(nèi)存a中數(shù)據(jù)為常量,不可改變
*pa = 5; // error
但是可以改變指針的指向
int b = 5; pa = &b; // ok
底層const意味著指針指向的內(nèi)存中存儲(chǔ)的數(shù)據(jù)為常量,不可改變,
如 int a = 3;
int *const pa = &a;
即內(nèi)存a中存儲(chǔ)數(shù)據(jù)為常量,不可改變
int b = 5; pa = &b; // error
但是可以改變指針指向內(nèi)存中數(shù)據(jù)
*pa = 5; // ok
注:底層const使用的前提是存在指針,針對的指針?biāo)赶騼?nèi)存的數(shù)據(jù)。
3.盡可能使用const,enum,inline替換#define
宏:未經(jīng)過C++的類型檢測機(jī)制,是存在安全隱患的。
如果打算使用#define PI 3.14 ,請使用double const PI = 3.14
如果打算使用#define RED RGB(0XFF,0X00,0X00)
#defineGREEN RGB(0X00,0XFF,0X00)
#defineBLUE RGB(0X00,0X00,0XFF)
請使用enum COLOR
{
RED = RGB(0XFF,0X00,0X00),
GREEN = RGB(0X00,0XFF,0X00),
BLUE = RGB(0X00,0X00,0XFF)
};
如果打算使用#define squr(a) a*a
請使用 double sque(doubleconst a) const { return a * a; }
如果打算書寫函數(shù)
double sque(double const a) const { returna * a; }
與
double sque(double const a) { return a * a;}
請停止,完全可以使用一個(gè)函數(shù)double sque(double const a)const { return a * a; }
完成兩個(gè)函數(shù)的功能,達(dá)到減少代碼冗余的目的。
兩個(gè)函數(shù)可以構(gòu)成重載函數(shù)的關(guān)系,const對象只能調(diào)用const函數(shù),非const函數(shù)同樣可以調(diào)用const函數(shù)。
const具有安全性檢測與數(shù)據(jù)保護(hù)功能,請盡量使用const關(guān)鍵字修飾變量,對象,引用,指針,函數(shù)。
5.防止const返回可以改變對象的行為
如下代碼
struct CPoint
{
inta;
intb;
};
class Rectangle
{
public:
CPoint& Get() const { return point;}
PRivate:
CPointpoint;
};
通過返回CPoint& 完全可以改變內(nèi)部對象的狀態(tài)。即返回內(nèi)部對象的引用即相當(dāng)于公開的內(nèi)部對象,效果同public,破壞的封裝。同const函數(shù)的作用完全違背。請避免變樣使用。請使用下面的方法:
CPoint Get() const { return point;}
const CPoint& Get() const {returnpoint;}
6.mutable與valatile的使用
說了const就不得不提mutable與volatile。
const對象的值不能被改變,但是mutable成員的值卻可以被修改
struct CPoint
{
inta;
mutableint b;
};
void change_point(CPoint const point) const
{
++point.a; // error
++point.b; // ok
}
代碼中編譯器經(jīng)常對內(nèi)存進(jìn)行優(yōu)化,volatile表示變量是易變的,表示可以被某些編譯器未知的因素更改。尤其高并發(fā)時(shí)期。此時(shí)可使用volatile int a; 告訴優(yōu)化器不要優(yōu)化這個(gè)變量,請時(shí)時(shí)從內(nèi)存中讀取。
個(gè)人總結(jié),僅供參考,如果有什么忽略的或者好的意見,請大家不吝賜教。
(ps :個(gè)人郵箱:wangqing10520@sina.com)。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注