(一) const 的一件奇妙事情是,它容许你指定一个语义约束(也就是指定一个“不应被改动”的对象),而编译器会强制实施这项约束。关键字 const 能够用它在 classes 外部修饰 gloabl 或 namespace 做用域中的常量,或修饰文件,函数,或区块做用域中被声明为 static 的对象。也能够修饰 classes 内部的 static 和 non-static 成员变量。对于指针,能够指出指针自身,指针所指物,或二者都是(都不是)const;安全
char greeting[] = "hello";函数
char *p = greeting;spa
const char *p = greeting; //const data, non-const pointer指针
char* const p = greeting; //const pointer, non-const data对象
const char* const p = greeting; // const data, const pointer接口
若是关键字 const 出如今星号左边,表示被指物是常量;若是出如今星号右边,表示指针自身是常量;若是出如今星号两边,表示被指物和指针二者都是常量。若是被指物是一个常量,则关键字 const 在星号以前或以后的意义是相同的。作用域
STL迭代器是以指针为根据塑模出来的,因此迭代器的做用就像一个 T* 指针。声明迭代器为 const 就像声明指针为 const 同样,表示这个迭代器不得指向不一样的东西,但它所指的东西的值是能够改变的。编译器
const 最具威力的用法是面对函数声明时的应用。在一个函数声明式内,const能够和函数返回值,各参数,函数自身产生关联。令函数返回一个常量值,每每能够下降因客户错误而形成的意外,而又不至于放弃安全性和高效性。例如:io
class Rational{...};编译
const Rational operator * (const Rational &lhs, const Rational &rhs);
Rational a, b, c;
(a * b) = c; //error 在 a * b 的结果上调用 operator *
(二)const 成员函数:
将 const 实施于成员函数的目的,是为了确认该成员函数能够做用于 const 对象身上。这一类成员函数之因此重要,基于两个理由。① 它们使 class 接口比较容易理解。这是由于,得知哪一个函数能够改动对象内容而哪一个函数不行是很重要的。② 它们使“操做 const 对象”成为可能。改善C++ 程序效率的一个根本方法是以引用传递的方式传递对象,而此技术可行的前提是,咱们有const 成员函数来处理取得的 const 对象。
注意:
1)把一个 const 对象的地址赋给一个普通的,非 const 对象的指针也会致使编译时的错误
2)容许把非 const 对象的地址赋给指向 const 对象的指针 ,但不能使用指向 const 对象的指针修改基础对象
double dval = 4.12;
const double *cptr = &dval;
*cptr = 3.14159; // error,cptr 是一个指向 const 对象的指针。
3)在实际的程序中,指向 const 的指针经常使用做函数的形参。将形参定义为指向 const 的指针,以此确保传递给函数的实际对象在函数中不由于形参而被修改。