最低权限原则是良好软件工程的最基本原则之一。使用const的好处:
1. 使用const,可以避免因为疏忽而错误地修改变量。
2. 使用const,能提高性能。编译器能够对const变量进行某些优化。
总之,use it whenever you need it。
const的使用情况,分三种:
1. const变量
(1) const变量
例1:const int i = 5; // int类型的变量i值为5,不可修改
例2:int i = 5;
const int *p = &i; // 不能通过指针p来修改它指向的内容
*p = 6; // error!
p = NULL; // OK!
i = 6; // OK!
例3:int i = 5;
int* const p = &i; // 指针p是const的,不可修改的
*p = 6; // OK!
p = NULL; // error!
例4:int i = 5;
const int* const p = &i; // 不能通过p修改它指向的内容;不能修改p的指向
小技巧:const在*号左边,则不能通过指针修改它指向的内容;
const在*号右边,则不能修改指针的指向。
注意:const变量在声明时要初始化;
不可以调用const对象的非const函数;
(2) const成员变量
const成员变量,一定要初始化,且一定要在初始化列表中初始化。
class A
{
public:
A(int i) : m_i(i) {}
private:
int m_i;
};
(3) const参数
如果参数是指针,且仅作为输入参数,则应声明为const,避免被修改。
void f(const int *p)
{
*p = 5; // error!
int i = *p;
i = 5; // OK!
}
void main()
{
int i = 0;
f(&i);
}
如果参数按引用传递,且仅作为输入参数,则应声明为const,避免被修改。
void f(const int& i)
{
i = 5; // error!
int k = i;
k = 5; // OK!
}
void main()
{
int i = 0;
f(i);
}
如果参数是作为输出参数,则不应该声明为const。
如果参数不是按引用传递,且不是指针,虽然能声明为const,但没有意义。因为会为参数生成一个新的临时对象,即使修改参数,只是修改的这个临时对象而已。
(4) const返回值
同const参数。
2. const成员函数
const成员函数中,不可以修改成员变量,mutable成员变量除外。
class A
{
public:
A() : i(5), k(7) {}
void f() const
{
i++; // error!
k++; // OK!
}
private:
int i;
mutable int k;
};
void main()
{
A a;
}
const函数不可以调用非const函数。
可以调用const对象的构造函数。
class A
{
public:
A(){i = 10;}
private:
int i;
};
void main()
{
const A a;
}