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)。
新闻热点
疑难解答