C++ 中 const 的使用

   (一) const 的一件奇妙事情是,它允许你指定一个语义约束(也就是指定一个“不该被改动”的对象),而编译器会强制实施这项约束。关键字 const 可以用它在 classes 外部修饰 gloabl 或 namespace 作用域中的常量,或修饰文件,函数,或区块作用域中被声明为 static 的对象。也可以修饰 classes 内部的 static 和 non-static 成员变量。对于指针,可以指出指针自身,指针所指物,或两者都是(都不是)const;

char greeting[] = "hello";

char *p = greeting;

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可以和函数返回值,各参数,函数自身产生关联。令函数返回一个常量值,往往可以降低因客户错误而造成的意外,而又不至于放弃安全性和高效性。例如:

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 的指针,以此确保传递给函数的实际对象在函数中不因为形参而被修改。

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(C++ 中 const 的使用)