准则1,如果你不想修改一个变量的值或者想让这个变量内联,那么就将这个变量声明为const
const int max = 1000;
const char* name = "parmanent name";
这些变量可以是全局变量,同样也可以是局部变量,将它们声明为一个全局变量可以促进它们的内联机会,并可以防止没有必要的修改。
下面一条准则是关于函数的
准则2,作为一个函数,对接收的值要self-disciplined, 对返回的值要relaxed.
这意味着,如果你能完全确定在一个函数中没有任何机会可以修改参数的值,那么就在它上面加上const, 但是不要在返回值上加const,除非编译器要求你这样做。
这背后的原因需要一点点的思考,在参数上加上const,是告诉别人,你只管传递给我参数,但是我保证不会去改变它的值,(或者说该函数对传来的参数没有任何副作用,我对这个参数很感兴趣)。
这其实是一件好事情,因为函数的调用者不希望它们传进来的参数,被意外的修改,他们需要完整的原始值,因为他们将在您返回后使用它们。
void foo(const char* in);
是否要将const放在参数上,取决于函数不会修改该参数,
但是下面这种情况就会出事情
void foo(const char* in) {
bar(in);
}
bar(char* in) {...}
首先你无法确定bar函数会不会修改in
这个参数,如果会修改参数,你就不可以在foo
的参数上放上const
。
这就是C++让人抓狂的地方,因为其它的函数可能是别人编写的,人家可能不会遵循你的规则,因为这样写是无聊的。
另一个方面,为什么你不应该将const放在返回类型上,因为这中做法是无意义的,这就像现实中别人在死后在遗嘱上写到“我的儿子可以继承我的房子,但是却不可以修改它”。但是这种限制真的可以实现吗?显然是不可以的。
回到编程的上下文中,不允许调用者修改你给它们的东西有什么意义?你应该将这件事情交给调用者来做,即使你做了,当const
妨碍它们的时候,它们就会使用const_cast
,这就使得返回const类型的值毫无用处。
所以记住不要在返回值类型上加上const。
如果你加上了可能会形成一条污染链
const char* bar();
void baz() {
const char* ret = bar();
bizarr(ret);
}
void bizarr(const char* in) {
bizarr2(in);
}
void bizarr2(const char* in);
所以还是不要在返回值类型上加上一个const
那么将在什么时候在返回值类型上加上const呢?