条款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]