找回密码
 立即注册
收起左侧

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

0
回复
5065
查看
[复制链接]
累计签到:41 天
连续签到:1 天
来源: 原创 2018-9-22 21:48:52 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 baizy77 于 2018-10-1 20:59 编辑

版权声明
---------------------------------------------------------------------------------------------------------------------
该文章原创于Qter开源社区(www.qter.org
作者: 女儿叫老白 (白振勇)
转载请注明出处!
---------------------------------------------------------------------------------------------------------------------
本套课程属于:《C++跨平台开发干货》系列课程。
-----------------------------------------------------------------------------

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

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了