Const,Const函数,Const变量,函数后面的Const (zz)

看到const 关键字,C++程序员首先想到的或是是const
常量。这只是免是优良的格反射。如果只有掌握用const
定义常量,那么一定给将药仅用于制作鞭炮。const
更不行之魅力是它可修饰函数的参数、返回值,甚至函数的定义体。

const 是constant 的缩写,“恒定不移”的意。被const
修饰的物都遭强制保护,可以防范意外的更动,能增强程序的健壮性。所以众多C++程序设计书籍建议:“Use
const whenever you need”。

1.之所以const 修饰函数的参数

使参数作输出用,不论它是呀数据类型,也任它使用“指针传递”还是“引用传递”,都不能够加const
修饰,否则该参数将错过输出功能。const 只能修饰输入参数:

万一输入参数采用“指针传递”,那么加const
修饰可以防范意外地改动该指针,起至保安作用。

例如StringCopy 函数:

void StringCopy(char *strDestination, const char *strSource);

内部strSource 是输入参数,strDestination 是出口参数。给strSource
加上const修饰后,设若函数体内的口舌试图改变strSource 的情节,编译器将指出错误。

比方输入参数采用“值传递”,由于函数将自行发出临时变量用于复制该参数,该输入参数本来就管需保障,所以不要加const
修饰。

像不要拿函数void Func1(int x) 写成void Func1(const int
x)。同理不要拿函数void Func2(A a) 写成void Func2(const A a)。其中A
为用户从定义之数据类型。

对此非内部数据类型的参数而言,象void Func(A a)
这样声明的函数注定效率比较的。因为函数体内用出A
类型的旋对象用于复制参数a,而临时对象的构造、复制、析构过程都以消耗时间。

以提高效率,可以用函数声明改也void Func(A
&a),因为“引用传递”仅借用一下参数的号而已,不需要出临时对象。但是函数void
Func(A &a) 存在一个欠缺:

“引用传递”有或变动参数a,这是我们无愿意的。解决者题材颇爱,加const修饰即可,因此函数最终成为void
Func(const A &a)。

以此类推,是否应将void Func(int x) 改写为void Func(const int
&x),以便提高效率?完全没必要,因为中间数据类型的参数不在构造、析构的经过,而复制也够呛抢,“值传递”和“引用传递”的频率几乎相当。

问题是这样的缠绵,我只能将“const &”修饰输入参数的用法总结一下。

 

对非内部数据类型的输入参数,应该以“值传递”的措施改变也“const
引用传递”,目的是提高效率。例如将void Func(A a) 改吗void Func(const A
&a)。

 

于内部数据类型的输入参数,不要以“值传递”的艺术转也“const
引用传递”。否则既达到不交提高效率的目的,又降了函数的可理解性。例如void
Func(int x) 不应变更呢void Func(const int &x)。

2 用const 修饰函数的返回值
假设被以“指针传递”方式的函数返回值加const
修饰,那么函数返回值(即指针)的情无克被修改,该返回值只能给授予给加const 修饰的同类型指针。例如函数 const char * GetString(void);
如下语句以起编译错误:
char *str = GetString();
对的用法是
const char *str = GetString();
设若函数返回值采用“值传递方式”,由于函数会拿返回值复制到表面临时之存储单元中,加const
修饰没有其它价值。
像不要管函数int GetInt(void) 写成const int GetInt(void)。
同理不要拿函数A GetA(void) 写成const A GetA(void),其中A
为用户从定义之数据类型。
假如回到值不是内部数据类型,将函数A GetA(void) 改写吗const A &
GetA(void)的确能够提高效率。但此刻绝对千万要小心,一定要作明白函数究竟是想回到一个靶的“拷贝”还是仅仅返回“别名”就可了,否则程序会拧。
函数返回值采用“引用传递”的场所并无多,这种艺术一般就出现在类的赋值函数中,目的是为着落实链式表达。

例如:
class A
{
A & operate = (const A &other); // 赋值函数
};
A a, b, c; // a, b, c 为A 的对象

a = b = c; // 正常的链式赋值
(a = b) = c; // 不正常的链式赋值,但官方
如若将赋值函数的回到值加const
修饰,那么该返回值的始末无允许为反。上例被,语句 a = b = c
仍然对,但是语句 (a = b) = c 则是地下的。
3 const 成员函数
别不会见改数据成员的函数都当声明也const 类型。如果在编制const
成员函数时,不慎修改了数额成员,或者调用了另外非const
成员函数,编译器将指出错误,这的确会增进程序的健壮性。以下顺序中,类stack
的积极分子函数GetCount 仅用于计数,从逻辑上摆GetCount 应当为const
函数。编译器将指出GetCount 函数中之荒谬。
class Stack
{
public:
void Push(int elem);
int Pop(void);
int GetCount(void) const; // const 成员函数
private:
int m_num;
int m_data[100];
};
int Stack::GetCount(void) const
{
++ m_num; // 编译错误,企图修改数据成员m_num
Pop(); // 编译错误,企图调用非const 函数
return m_num;
}
const 成员函数的宣示看起怪怪的:const
关键字只能放在函数声明的尾部,大概是盖另外地方还早已为占用了。
至于Const函数的几乎触及规则:

a.
const对象只能看const成员函数,而不const对象足以看任意的积极分子函数,包括const成员函数.
b.
const对象的分子是不足修改的,然而const对象通过指针维护的对象也是好修改的.
c.
const成员函数不得以改对象的数额,不管对象是不是富有const性质.它以编译时,以是否修改成员数量吧因,进行检查.
e.
然而丰富mutable修饰符的数量成员,对于任何情形下通过其它手段还不过改,自然这底const成员函数是可以修改其的

 

转http://www.cnblogs.com/Fancyboy2004/archive/2008/12/23/1360810.html