前言
c++中const的运用十分灵活,他改善了程序的健壮性,他是c++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型。
一、const的作用?
const成员变量:只能在初始化列表中初始化
例:
class A
{
public:
A(int _x) : x(_x) {} //const成员变量只能在初始化列表初始化
const int x;
};
const成员函数:防止成员函数修改非静态成员变量的值,const成员函数可以修改静态成员变量。
例:
class Box
{
public:
Box(int w) : width(w){} //初始化列表初始化成员变量
int getWidth() const; //const函数声明
void setWidth(int w);
void showBox();
static int x; //静态成员变量
int width; //非静态成员变量
};
int Box::x = 10; //静态成员函数变量初始化
void Box::showBox()
{
cout << width << endl;
}
void Box::setWidth(int w)
{
width = w;
}
int Box::getWidth() const
{
x = 5;
width = 10; // 错误写法 const函数无法修改非静态成员变量
setWidth(10); //错误写法 const函数无法调用非const函数
showBox(); // 错误写法 const函数无法调用非const函数
return width;
}
二、将const类型转化为非const类型的方法
采用const_cast 进行转换。
用法:const_cast <type_id> (expression)
该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。
· 常量指针被转化成非常量指针,并且仍然指向原来的对象;
· 常量引用被转换成非常量引用,并且仍然指向原来的对象;
· 常量对象被转换成非常量对象。
三,使用const的建议
· 要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委;
· 要避免最一般的赋值操作错误,如将const变量赋值,具体可见思考题;
· 在参数中使用const应该使用引用或指针,而不是一般的对象实例,原因同上;
· const在成员函数中的三种用法(参数、返回值、函数)要很好的使用;
· 不要轻易的将函数的返回值类型定为const;
· 除了重载操作符外一般不要将返回值类型定为对某个对象的const引用;
· 任何不会修改数据成员的函数都应该声明为const 类型。
总结
1. 一般情况下,函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。通常,不建议用const修饰函数的返回值类型为某个对象或对 某个对象引用的情况。原因如下:如果返回值为某个对象为const(const A test = A 实例)或某个对象的引用为const(const A& test = A实例) ,则返回值具有const属性,则返回实例只能访问类A中的公有(保护)数据成员和const成员函数,并且不允许对其进行赋值操作,这在一般情况下很少 用到。
2. 如果给采用“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。
3. 函数返回值采用“引用传递”的场合不多,这种方式一般只出现在类的赙值函数中,目的是为了实现链式表达。