您的位置:首页 > 编程语言 > C语言/C++

Effective C++,Rule 3,使用const

2017-04-30 08:37 148 查看

前言

const允许用户定义一个语义上的约束。”语义”上是指约束只作用在源代码层上,而不能在汇编这一层发挥作用。”约束”是指一种限制要求,这要求const修饰的对象不应该被修改。在实际的开发中,应该保证所有那些在逻辑上具有”不改被修改”的对象都应该使用const来修饰之。至于这么做的好处,更多的是在源代码层这一层保证进程空间内数据的完整性,在很大程度上避免对关键数据的不恰当修改而导致的出乎意料的错误。

const的用法

const主要用于两种场合,一种是修饰变量,这里的变量保括全局的、命名空间里的、类成量变量、函数中、区块中的变量;另一种是修改函数,包括修饰函数返回值、参数、函数本身。

修饰变量

语法规则

const所修饰的变量,在其生存期内,它的所有比特是不能被修改的,这要求在初始化的过程中为其设置值,而不能通过赋值运算来设置。

const 在与已定义最小变量类型(而非组合)互换位置时,其语义不变。

这里 重点强调第二点,先看下面几个声明。

class XXX
{
char const c1;
const char c2;
const char * p1;
char const *p2;
char * const p3;
typedef char * charp;
const charp p4;
charp const p5;
}


其中 c1与c2是具有相同性质的变量,他们都是常量字符变量,当他们的值被初始化后,其值再也不能被修改。

p1与p2的含义也是相同,因为const char*与char const* 中,const是与char与换位置,char是离const最近的最小变量类型.p1、p2都是所指之间为常量的指针。

p3是含义是指针本身是常量,其所指物无约束。

const charp 与charp const中,因为charp已经被typedef封装成一个最小的变量类型,因而const与charp互换位置时 其语义不变。他们的含义都与p3相同,因为 charp const = (char ) const = const charp =const (char ).当然 没有(char )const和const (char )这样子的语法,不过这是一个理解思路。

值的一提的是,STL里面的所有迭代器的原型都是typedef Typename * iterator.因此,与上面举得例子类似,const vector::iterator 其中是指该迭代器本身不得变化,但是它所指的变量是可以变量的。

修饰函数

语法规则

修饰返回值:
const Typename XXX(XXX...)


让函数返回一个const变量值是相当有好处的,尤其是返回一个类时。看下面的代码,体会一下。

class Complex {...};
Complex operator * (const Complex & lhs,const Complex & rhs);


上面的代码声明了一个复数类,并想重载乘法运算符号。乍一眼看上去,好像没有什么毛病,但是再看以下的代码:

Complex v1,v2,v3;
···
···(v1*v2)=v3···
···


这种语句应该是不故意写出来的,而是写的紧急,一时写误。更有可能是下面这样的情况:

Complex v1,v2,v3;
···
if((v1*v2)=v3)
···
··


开发者原本只是想判断一下的,但是却误把判等符写成赋值符号

而解决这个问题的很好的方法就是为这个重载函数的返回值加上const

const Complex operator * (const Complex & lhs,const Complex & rhs);


在编译到if((v1*v2)=v3)时 编译器就会有报错提示。

2.修饰函数变量:
Typename Func(const XXX...)


const修饰函数变量时,与const修饰普通变量并不差别,都是在函数内为函数变量加上常量约束的。

3. 修饰函数

const修饰函数为语法为:
ValueType Func(paras...) const
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: