const 在函数声明方面还有一些强大的用途。在一个函数声明的内部, const 可以应用在返回值、单个参数,对于成员函数,可以将其本身声明为 const 的。
让函数返回一个常量通常可以减少意外发生的可能,而且不用放弃考虑安全和效率问题。好比有理数乘法函数( operator* )的声明,更多信息请参见第 24 项。
class Rational { ... };
const Rational operator*(const Rational& lhs, const Rational& rhs);
很多程序员在初次到这样的代码时都不会正眼看一下。为什么 operator* 要返回一个 const 对象呢?这是因为如果不是这样,客户端将会遇到一些不愉快的状况,比如:
Rational a, b, c; ... (a * b) = c; // 调用 operator= 能返回一个 a*b !
我不知道为什么一些程序员会企图为两个数的乘积赋值,但是我确实知道好多程序员的初衷并非如此。他们也许仅仅在录入的时候出了个小差错(他们的本意也许是一个布尔型的表达式):
f (a * b = c) ... // 噢 … 本来是想进行一次比较!
显而易见,如果 a 和 b 是内建数据类型,那么这样的代码就是非法的。避免与内建数据类型不必要的冲突,这是一个优秀的用户自定义类型的设计标准之一(另请参见第 18 项),而允许为两数乘积赋值这让人看上去就很不必要。声明 operator* 函数时如果让其返回一个 const 型数据则可以避免这一冲突,这便是要这样做的原因所在。
const 的参数没有什么特别新鲜的——它们与局部 const 对象的行为基本一致,你在必要的时候要尽可能使用它们。除非你需要更改某个参数或者局部对象,其余的所有情况最好都声明为 const 。这仅仅需要你多打六个字母,但是它可以使你从恼人的错误(比如我们刚才见到的“我本想打‘ == ’但是却打了‘ = ’”)中解放出来。

const 成员函数
对成员函数使用 const 的目的是指明这些成员函数可以被 const 对象调用。这一类成员函数是很重要的,首先,它们使得类的接口更加易于理解。c 类 static 函数很有必要了解哪些函数可以修改而哪些不可以。其次,这些函数可以与 const 对象协同工作。这对于高效编码是十分重要的一方面,这是由于(将在第 20 项中展开解释)提高 C++ 程序性能的一条最基本的途径就是:传递对象的 const 引用。使用这一技 术需要一个前提:这就是首先要有 const 成员函数存在,并且它们用于处理之前生成的 const 对象。
如果若干成员函数之间的区别仅仅为“是否是const 的”,那么它们也可以被重载。很都忽略了这一点,但是这是 C++ 重要特征之一。请观察下面的代码,这是一个文字块的类:
class TextBlock {
public:
...
const char& operator[](std::size_t position) const // operator[] 用于返回相应位置的字符
{ return text[position]; } // 返回一个 const 对象
char& operator[](std::size_t position) // operator[] 用于返回相应位置的字符
{ return text[position]; } // 返回一个非 const 对象
private:
std::string text;
};
TextBlock 的 operator[] 可以这样使用:
TextBlock tb("Hello");
std::cout << tb[0]; // 调用非 const 的 TextBlock::operator[]
const TextBlock ctb("World");
std::cout << ctb[0]; // 调用 const 的 TextBlock::operator[]
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-62399-2.html
爱情
公关了
光看数量就行了