C++老鸟日记028 有关const的一点知识

微信公众号: 星点课堂

新浪微博:女儿叫老白

网易云课堂:女儿叫老白

网易云课堂免费课程:《C++跨平台开发中的编译错误》

网易云课堂免费课程:《C++老鸟日记》

----------------------------------------------------------------------------

引言:

----------------------------------------------------------------------------

       在C++编程中,我们经常会用到一些常量、或者常量指针、常量引用、不改变成员变量的函数等等,这些统统都会用到const,我们今天就来讨论一下const的相关知识。

 

正文:

----------------------------------------------------------------------------

       在C++中,const默认为内部链接,也就是仅在定义它的编译单元可见(比如某个文件中)。一般我们会把const定义的量放在头文件中,这样只需要包含该头文件就可以使用该const数据了。定义一个const时,必须给它赋初值,除非用extern进行声明。

       extern const float pi;

       我们可以对const进行数学计算得到其他的const值,比如:

       const int c_maxNumber1 = 10;

       const int c_maxNumber2 = c_maxNumber1 + 5;

       char szBuf[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* const p = &val;

p是一个const指针,它指向一个int地址,该地址的内容为const(不可改变),因此指针和对象都不可改变。

我们来放松一下,看点简单的。在函数定义中,函数的参数如果在函数体重不被改变,我们通常会把他们定义为const引用参数进行传入,比如:

CParam getParam(const CMyClass& myclass);

这样,可以有效提高运行效率:因为传递的是引用就省去了拷贝构造的过程,而因为是const,表明该对象不会被修改,否则编译器会报错。

如果我们在一个类的成员函数中,非常明确的知道不会修改成员变量的值,那么就可以把这个函数声明为const,比如:

// myclass.h

class CMyClass {

public:

int getValue()const {return m_nValue;}

int setValue(int val) {m_nValue=val;}

       private:

              int m_nValue;

};

我们还可以为函数返回值指定const修饰,这表明返回的数据不允许被修改,比如stl的string有一个接口c_str(),这个接口就返回const _Elem*,表明返回的地址所指向的内容不允许被修改。

如果我们希望定义一个常量length,而我们想把这个常量名字(length)用在各个不同的类中,那么就可以在类这种用const定义一个成员变量。如果一个const被用在了类里,那么用const定义的成员必须在构造函数的最初阶段初始化,我们来看一下它如何初始化;

       // array.h

       class CArray {

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的各种不同应用场景来发挥它的强大作用。

 

猜你喜欢

转载自blog.csdn.net/baizy77/article/details/82811611