1. const是一種類型修飾符,用于說明永不改變的對象,const對象一旦定義就無法再改變,所以const對象必須初始化。
2.頂層const與底層const區別
位于*左側為底層const,位于*右側為頂層const
頂層const意味著內存本身存儲的數據是常量,
如int const a = 3;
即變量a是常量,不可改變。a = 5;//error
如int const *pa = &a;
即pa所指向內存a中數據為常量,不可改變
*pa = 5; // error
但是可以改變指針的指向
int b = 5; pa = &b; // ok
底層const意味著指針指向的內存中存儲的數據為常量,不可改變,
如 int a = 3;
int *const pa = &a;
即內存a中存儲數據為常量,不可改變
int b = 5; pa = &b; // error
但是可以改變指針指向內存中數據
*pa = 5; // ok
注:底層const使用的前提是存在指針,針對的指針所指向內存的數據。
3.盡可能使用const,enum,inline替換#define
宏:未經過C++的類型檢測機制,是存在安全隱患的。
如果打算使用#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; }
如果打算書寫函數
double sque(double const a) const { returna * a; }
與
double sque(double const a) { return a * a;}
請停止,完全可以使用一個函數double sque(double const a)const { return a * a; }
完成兩個函數的功能,達到減少代碼冗余的目的。
兩個函數可以構成重載函數的關系,const對象只能調用const函數,非const函數同樣可以調用const函數。
const具有安全性檢測與數據保護功能,請盡量使用const關鍵字修飾變量,對象,引用,指針,函數。
5.防止const返回可以改變對象的行為
如下代碼
struct CPoint
{
inta;
intb;
};
class Rectangle
{
public:
CPoint& Get() const { return point;}
PRivate:
CPointpoint;
};
通過返回CPoint& 完全可以改變內部對象的狀態。即返回內部對象的引用即相當于公開的內部對象,效果同public,破壞的封裝。同const函數的作用完全違背。請避免變樣使用。請使用下面的方法:
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
}
代碼中編譯器經常對內存進行優化,volatile表示變量是易變的,表示可以被某些編譯器未知的因素更改。尤其高并發時期。此時可使用volatile int a; 告訴優化器不要優化這個變量,請時時從內存中讀取。
個人總結,僅供參考,如果有什么忽略的或者好的意見,請大家不吝賜教。
(ps :個人郵箱:wangqing10520@sina.com)。
新聞熱點
疑難解答