国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

關(guān)鍵字const的使用總結(jié)

2019-11-11 01:40:01
字體:
供稿:網(wǎng)友

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)。

 

 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 柳江县| 繁峙县| 略阳县| 延安市| 鹤山市| 炎陵县| 洛宁县| 松溪县| 永清县| 绥江县| 获嘉县| 娱乐| 三门峡市| 曲阳县| 宣汉县| 昌乐县| 中卫市| 永新县| 墨竹工卡县| 华亭县| 巴林左旗| 莲花县| 普陀区| 进贤县| 福建省| 安徽省| 五常市| 木里| 雅江县| 宁海县| 布拖县| 东乌珠穆沁旗| 浦江县| 宜昌市| 双鸭山市| 紫金县| 湘潭县| 新河县| 湟中县| 若尔盖县| 东安县|