首页 > 学院 > 开发设计 > 正文

关键字const的使用总结

2019-11-11 02:49:40
字体:
来源:转载
供稿:网友

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

 

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表