我的更多C++技术帖在此

当年在学习java的时候,常常为没有 C++ const对应的关键字而烦恼。一直以来(包括现在)我认为有const存在,是对调用者的一种承诺、对维护方便的保证,在工作中、论坛、博客等网络资料 中,都可以发现很多C++程序员几乎并不使用const。下面尽可能多的列举const使用的多个方面,欢迎大家参与讨论和补充。

1,函数的常量引用参数
如一个常规的函数定义:
A方案
代码: 全选
void test(int n) {
    cout << "n = " << n << endl;  // 仅仅是打印n的值,不需对n做任何处理
}

这里就存在一个不必要的栈空间消耗:n在栈区占有一个int的空间,而传到函数体的却是n的一个拷贝(临时变量),而这个临时变量是完全可以避免的:
B方案
代码: 全选
void test(int& n) {
    cout << "n = " << n << endl;
}

这样就确保不会产生临时变量。
但是这里还是有违我的本意,我并不想在函数体内改变n的值,而函数的声明告诉调用者,n有可能被改变;另外调用者不能像这样调用:test(5);,因为C++标准规定不能将5这样的临时int变量传给 非 const int&参数,所以我们的代码最终改成:
C方案
代码: 全选
void test(const int& n) {
    cout << "n = " << n << endl;
}

这样就确保1,没有额外的int临时变量产生;2,告诉调用者,test()函数不会改变n的状态(值);

还有一种const 传参数的无效用法
代码: 全选
void test(const int n) {
    cout << "n = " << n << endl;
}

没有引用,效果同A方案,因为n不可能在函数体内被改变,改变的是额外产生的临时变量(n的拷贝);

下面有一个比较触目惊心的例子,出自现实中的项目:
bool func(vector<Shape> shapes) { // 想象一下shapes.size() 为10000或更大时的情况
.... // 为什么不用 vector<Shape>& shapes //要改变shapes的状态 或
// const vector<Shape>& shapes //不改变shapes的状态
}

引用保证在传参过程中不会产生额外的临时对象,const 保证作为参数的变量不会在函数体内改变。