条款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[position]; }
  // operator[] for const objects
  const char& operator[](int position) const
  { return data[position]; }
private:
  char *data;
};
String s1 = "Hello";
cout << s1[0];                  // calls non-const
                                // String::operator[]
const String s2 = "World";
cout << s2[0];                  // 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));

你可能感兴趣的:(C++,c,C#)