条款三 尽可能使用const

1.const 修饰指针

char greeting[] = "hello";
char *p = greeting; //non-const pointer,non-const data
const char *p = greeting; //non-const pointer,const data
char* const p = greeting; //const pointer,non-const data
const char* const p = greeting; //const pointer,const data

 

2.STL迭代器

vector<int> vec;
const vector<int>::interator iter = vec.begin(); //iter指向的值可以改变,但指向的地址不可改变,++iter是错误的 
vector<int>::const_iterator citer = vec.begin(); //citer指向的值不可改变,但地址可以改变,++citer是对的,但(*citer)++是错误的

 

3.const可以和函数返回值,参数以及函数本身产生关联,如一个类里的重载操作符函数
class Rational{.....};
const Rational operator* (const Rational& lhs,const Rational& rhs); //重载操作符*函数
const返回值为const类型可以防止如下面情况发生
Rational a,b,c;
(a * b) = c;
//把c对象赋给a*b的结果,这个情况一般是无意中发生,如if((a * b) = c),也许本意是判断相等的==,但漏写了一个=,
//要是*操作返回类型不是const,则不会报错,所以很难查找到出错的地方

4.类的成员函数

class Test
{
.....
//这两个函数是互为重载
//被const类对象调用,函数无法改变non-static成员变量的值,可以改变static变量的值
const char& operation[] (size_t pos) const 
{
str = "world" ; //错误
str_1 = "world" ; //正确
str_2 = "world" ; //正确
return str[pos];
}

char& operation[] (size_t pos) {return str[pos];}
//被non-const类对象调用,可以改变成员变量

private:
string str;
mutable string str_1; //mutable使得const约束的成员函数也可以改变str_1的值
static string str_2; //static成员变量,可以初始化(vc6.0不支持)
};

string Test::str_2; //这步是必须的,可以初始化,也可以不必

---------------------------------------------------------------------------------------------

#include <iostream>
#include <string>
using namespace std;
class Test
{
public:	
	void print() const 
	{
		cout << "const fun" << endl;
		//str = "hello world";   //出错
		str_2 = "world";
		str_1 = "hello";
		cout << str_1 << "  " <<str_2 << endl;
	}	
	void  print() {cout << "non-const fun" << endl;}
private:
	string str;
	mutable string str_1;
	static string str_2;
};
string Test::str_2 ;
int _tmain(int argc, _TCHAR* argv[])
{
    const  Test t;
    t.print();
    return 0;
}

 

 


posted @ 2012-07-18 16:58  bizhu  阅读(251)  评论(0编辑  收藏  举报