编码阶段,许多人不太留意const的利用,认为无关紧要,假如你开拓的是一个简朴的系统,假如你一小我私家就能记着所有变量的意义,假如你一小我私家就能节制所有变量的利用位置,假如你的软件宣布后不需要更多的维护事情,那么你可以健忘const,不然,const就是一个多个措施员之间相同的强大东西。
首先,const的最根基用法就是标识常量,使编译器可以或许检测出对该变量的不正确利用,也可以使其他的措施员利用此常量时,留意不能改变此常量。const呈此刻差异的位置有差异的意义。
√ const int number = 1; // 该变量为常量,今后不能再对它赋值,所以这里必需赋初值
√ const int * pNumber; // 指向常量的指针,(*pNumber)的值不能改变,但指针pNumber的值可以改变
√ int * const pNumber = & number2; // 指向变量的常量指针,指针的值不能改变,所以必需先初始化
√ const int * const pNumber = & number; // 指向常量的常量指针,常量和指针的值都不能改变,所以必需先初始化
√ const int & number1 = number; // 指向常量的引用,C++中所有的引用都是常量引用,一个引用指向一个变量后,不能再改变值指向另一个变量,所以岂论是否说明,引用都是常量引用,必需在初始化时赋初值
其次,C++对函数的参数不区分输入参数和输出参数,并且常常由于一个返回值不足用,我们会通报几个引用或指针来吸收返回值。我们可以用const来标明某参数为输入参数,函数内不会改变此参数的值,如下面一个函数:
bool CopyClass(Value & dest, const Value & src);
个中,Value为用户界说的类,CopyClass函数的成果为拷贝src的内容到dest,src为输入参数,其值不能被改变,dest为输出参数,其他措施员按照函数的界说,就能对函数的成果有个清晰的相识。
下面,让我们来看一下const的最后一种用法。请看下面CopyClass函数和Value类的实现:
class Value {
public:
int GetValue() { return _value; }
private:
int _value;
}
bool CopyClass(Value & dest, const Value & src) {
int v = src.GetValue();
…………
}
请问:这段代码能编译通过吗?测试一下,公然呈现了编译错误,错误呈此刻下面语句:
int v = src.GetValue(); // 编译错误,由于src为指向常量的引用,编译器无法确定GetValue函数是否改变了src的内容,所以克制挪用
那么,我们只能放弃利用const标识输入参数了吗?不,我们还有步伐,只要把GetValue函数的界说作如下改变即可:
int GetValue() const { return _value; } // const暗示对通报给它的this指针指向的内容(即Value类)不做任何改变
颠末这样的改变,上述代码就能编译通过了,其他的措施员也可以很快的相识到,该成员函数只是输出类工具的内容,不会改变类工具的任何内容。