kmplayer 发表于 2013-2-5 01:37:00

条款21:尽可能使用const

1,只要某值真的保持不变,就应该明确表示出来,这样一来便可以获得编译器的帮助.

2,const最具威力的用途用在函数声明上.

3,令函数返回一个常量值,可以降低client的错误,有不至于放弃效率.
如:
const Rational operator*(const Rational& lhs,const Rational& rhs);
为了防止下面的情况:
Rational a, b, c;
...
(a * b) = c;      // assign to the product of a*b!
注:将一个数值赋给两个数值的乘积结果,这在内建型别中肯定不合法.

4,将const应用于参数身上,其行为就想local const对象一样.

5,const member函数,指明那个成员函数可由const对象调用.
例:
class String
{
public:
...
// operator[] for non-const objects
char& operator[](int position)
{ return data; }
// operator[] for const objects
const char& operator[](int position) const
{ return data; }
private:
char *data;
};
String s1 = "Hello";
cout << s1;                  // calls non-const
                              // String::operator[]
const String s2 = "World";
cout << s2;                  // calls const
                              // String::operator[]


6,bitwise constness(位常量论)
如果成员是指针,意味着指针指向的对象可以被修改.
由此导出conceptual constness(概念常量论)

关键字:mutable,可以有效解放nonstatic data members在bitwise constness方面的束缚.

7,可能你想要改变const String* const str的值.
可能可行的办法:
做出一个local版的str,去掉const属性.
String* const localStr = const_cast<String* const>(str);
改变localStr,意味着str的改变,因为指针指向同一个地方.

还有一种情况:
例如strlen错误的声明:
size_t strlen(char *s); //应该是const char* s

cosnt char* mm="wisdom";
此时可以这么做:
strlen(const_cast<char*>(mm));
页: [1]
查看完整版本: 条款21:尽可能使用const