const 与变量
const关键字修饰变量,它会在编译期间(时机很重要),告诉编译器这个对象是不能被修改的。
const的作用:他可以保护变量,防止它们被无意的修改。可以优化编译结果,让可执行程序更为紧凑。
合理的使用 const 可以让你写出来的程序更为严谨、健壮,不易出错,乃至于更加高效。
const int* p1 = &i;
int const* p2 = &i;
上面这段代码表示指针所指的内容为常量,你不能做 *p1 = 1; 这样的操作,但可以 p1++;
int* const p3 = &i;
const int* const p4 = &i;
上面这段代码表示指针为常量,你无法修改 p3,如 p3++;,但你可以执行 *p3 = 1;。最后一行中,p4 和其所指向的内容都是 const 的。
规律:如果 const 在 * 号左边,就表示指针所指的内容是常量,否则指针本身是常量。
const int a=2;
const int &b=a;//正确
int &c=a;//此语句错误 不能用非const引用指向const对象
注意:普通的引用无法绑定到const对象上,只可以读取而不可以修改,这也是const关键字的主要作用。
double a=1;
const int &b=a;
当编译器执行这两句代码时,会完成如下操作:
int t=a;
const int &b=t;
编译器会创建一个int型的暂时变量t存储a,然后将b指向t。
注意:引用在内部存放的是一个对象的地址,它是该对象的别名。对于不可寻址的值,如文字常量,以及不同类型的对象,编译器为了实现引用,必须生成一个临时对象,引用实际上指向该对象,但用户不能访问它。
const 与函数
在一个类中,任何不会修改数据成员的函数都应该声明为const类型。使用const关键字进行说明的成员函数,称为常成员函数。只有常成员函数才有资格操作常量或常对象。 没有使用const关键字说明的成员函数不能用来操作常对象。
int GetCount(void) const;//定义为const成员函数
可以通过给函数添加const来实现函数重载:
#include <iostream>
using namespace std;
class R {
public:
R(int r1, int r2) {
R1=r1;
R2=r2;
}
void print();
void print() const;
private:
int R1, R2;
};
void R::print() {
cout<<R1;
}
void R::print() const {
cout<<R2;
}
int main() {
R a(5, 4);
a.print();
const R b(20, 52);
b.print();
return 0;
}
其中print成员函数就实现了两个版本,输出结果为 5,52。 const对象默认调用const成员函数。
void function(const int a);
参数指针所指内容为常量不可变。
void function(const int* a);
参数指针本身为常量不可变
void function(int* const a);
参数为引用,为了增加效率同时防止修改。
总结:这样的一个const引用传递和最普通的函数按值传递的效果是一模一样的,const禁止对引用的对象的一切修改,唯一不同的是按值传递会先建立一个类对象的副本, 然后传递过去,而const直接传递地址,所以这种传递比按值传递更有效.