有些情况下,使用const并没有太多意义。
假设你有以下函数:
void myFunction (const int value);
const关键字告诉编译器在函数内该值不能改变。对于调用者来说,这个信息没有任何价值。函数本身决定如何处理该值。对于调用者来说,以下两个函数定义表现完全相同:
void myFunction (const int value);
void myFunction (int value);
因为传递的是值,这意味着函数无论如何都会得到一个本地副本。
另一方面,如果参数是引用或指针,情况就变得非常不同。
void myFunction (const MyClass &value);
这告诉调用者该值是按引用传递的(在幕后实际上是指针),但调用者承诺不更改该值。指针也是如此:
void myFunction (const MyClass *value);
因为性能原因,我们传递了 MyClass 的指针,但是该函数保证不会修改该值。
如果我们写下如下代码:
void myFunction (MyClass * const value);
那么我们回到了最初的情况。myFunction获取一个指针,该指针通过值传递,并且是const类型的。由于MyFunction获得了指针值的副本,因此对于调用者来说,它是否为const并不重要。最重要的是,myFunction可以更改value的内容,因为指针变量本身是const,但其中的内容则不是。
返回值也是如此:
const double squareRoot(double d);
这没什么意义。squareRoot返回一个const double,但由于这是通过值传递的,因此需要复制到我的本地变量中,我可以随意对其进行操作。
另一方面:
const Customer *getCustomer(char *name);
告诉我getCustomer返回一个指向客户的指针,我不被允许更改该客户的内容。
实际上,最好也将char指针内容设置为const,因为我不希望该函数更改给定的字符串。
const Customer *getCustomer(const char *name);