在程序中,const是使用频率较高的关键字,主要用来确保指针或其他变量不被随意修改。
将const放在变量前面,需将该变量进行初始化,并不可被修改:
const int iCount = 6;
const char* p = "hello";
iCount = 3; //Error 不能给常量赋值
p = "name"; //Error 不能给常量赋值
也可以将const放在函数形参中,用于形参不可以被修改:
void f1(const Widget *pWin); //pWin所指形参不可被修改
放在迭代器中:
std::vector<int> vec;
vec.push_back(5);
const std::vector<int>::iterator ite = vec.begin();
++ite; //Error ite是const
我们也可以使用const来避免一些错误的编码形式,例如:为了防止出现以下形式的编码:
Persons p1,p2,p3;
...
(p1 + p2) = p3; //暴力的代码
我们可以在类Persons中,对操作符“+”作如下声明:
const Persons operator+(const Persons* lhs,const Persons& rhs);
在类中,可以使用const修饰一个成员函数,说明该函数不可以改变类的内容:
class A
{
...
void f1() const;
};
我们也可以使用const来区分调用不同的类重载接口,看看下面这个类:
class ClassA
{
public:
char& operator[](std::size_t pos) {
return text[pos];
}
const char& operator[](std::size_t pos) const{
return text[pos];
}
private:
std::string text = "niaoshu";
};
通过以下方式来调用:
const ClassA A;
std::cout << A[2] << std::endl; //OK,输出:‘a’
A[2] = 'k'; //Error
ClassA B;
std::cout << B[2] << std::endl; //OK,输出:‘a’
B[2] = 'k'; //OK
另外,我也可以使用const_cast去掉接口的const属性:
const ClassA A;
ClassA* pA = const_cast<ClassA*>(&A);
(*pA)[2] = 'J'; //OK
std::cout << A[2] << std::endl; //输出:'J'
当然,在实际的应用中,我们尽量谨慎使用const_cast,从某些角度讲,它降低了程序的安全性和稳定性。
未完待续!