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

版权声明

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

该文章原创于Qter开源社区(www.qter.org

作者: 女儿叫老白 (白振勇)

转载请注明出处!

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

课程目录:《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:

         const  int m_nLength;

           int m_nStep;

};

       在这段代码中,m_nLength必须在冒号之后、花括号之前初始化,如果写成这样就错了:

CArray(int len) {

m_nLength = len;

m_nStep=5;

}

   因为m_nLength不允许被修改(赋值),即使在构造函数体中也不行。

 

结语:

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

       const被广泛用在常量定义、函数参数修饰、函数返回值修饰、函数体修饰等方面,我们可以充分借助const的各种不同应用场景来发挥它的强大作用。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

女儿叫老白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值