本帖最后由 baizy77 于 2018-10-1 20:59 编辑
版权声明 --------------------------------------------------------------------------------------------------------------------- 作者: 女儿叫老白 (白振勇) 转载请注明出处! --------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------
引言: ---------------------------------------------------------------------------- 在C++编程中,我们经常会用到一些常量、或者常量指针、常量引用、不改变成员变量的函数等等,这些统统都会用到const,我们今天就来讨论一下const的相关知识。
正文: ---------------------------------------------------------------------------- 在C++中,const默认为内部链接,也就是仅在定义它的编译单元可见(比如某个文件中)。一般我们会把const定义的量放在头文件中,这样只需要包含该头文件就可以使用该const数据了。定义一个const时,必须给它赋初值,除非用extern进行声明。 externconst float pi; 我们可以对const进行数学计算得到其他的const值,比如: constint c_maxNumber1 = 10; constint c_maxNumber2 = c_maxNumber1 + 5; charszBuf[c_MaxNumber+1]; 当我们定义一个const并初始化之后,就无法再修改其值,否则编译器就会报错。 const还用来修饰指针,请看如下两种编码方式含义是否一样? const float* p; float const * p; 这两句代码都没有给p赋初值,它们都表示u是一个指针,它指向一个const int;这是指向const的指针;那么const指针是何含义(8.2.2, para2)。我们看下列代码: int val = 0; int * const p =&val; p是一个const指针(它的值不可改变,所以必须初始化),它指向一个int地址。 看了这些内容,是不是有点晕?其实,我们可以简单记忆:const一般放在被修饰者的右侧,因此,这就容易理解了:p是一个指向int的指针,而int指针的值不可改变,也就是p不可改变。再看下面的代码: int val = 0; int const* constp = &val; p是一个const指针,它指向一个int地址,该地址的内容为const(不可改变),因此指针和对象都不可改变。 我们来放松一下,看点简单的。在函数定义中,函数的参数如果在函数体重不被改变,我们通常会把他们定义为const引用参数进行传入,比如: CParamgetParam(const CMyClass& myclass); 这样,可以有效提高运行效率:因为传递的是引用就省去了拷贝构造的过程,而因为是const,表明该对象不会被修改,否则编译器会报错。 如果我们在一个类的成员函数中,非常明确的知道不会修改成员变量的值,那么就可以把这个函数声明为const,比如: // myclass.h class CMyClass { public: int getValue()const {return m_nValue;} int setValue(int val) {m_nValue=val;} private: intm_nValue; }; 我们还可以为函数返回值指定const修饰,这表明返回的数据不允许被修改,比如stl的string有一个接口c_str(),这个接口就返回const _Elem*,表明返回的地址所指向的内容不允许被修改。 如果我们希望定义一个常量length,而我们想把这个常量名字(length)用在各个不同的类中,那么就可以在类这种用const定义一个成员变量。如果一个const被用在了类里,那么用const定义的成员必须在构造函数的最初阶段初始化,我们来看一下它如何初始化; //array.h classCArray { public: CArray(int len) : m_nLength(len),m_nStep(5) {}
private: int m_nLength; int m_nStep; }; 在这段代码中,m_nLength必须在冒号之后、花括号之前初始化,如果写成这样就错了: CArray(int len) { m_nLength = len; m_nStep=5; } 因为m_nLength不允许被修改(赋值),即使在构造函数体中也不行。
结语: ---------------------------------------------------------------------------- const被广泛用在常量定义、函数参数修饰、函数返回值修饰、函数体修饰等方面,我们可以充分借助const的各种不同应用场景来发挥它的强大作用。
|