1、用const修饰函数的输入参数。第一,对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用,目的是提高效率。例如将void Func(A a)改为voidFunc(const A&a)。第二,对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void Func(int x)不应该改为void Func(const int&x)。
第一,如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。例如函数
const char*GetString(void);
如下语句将出现编译错误:
char*str=GetString();
正确的用法是:
const char*str=GetString();
第二,如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。例如不要把函数int GetInt(void)写成const int GetInt(void)。同理不要把函数A GetA(void)写成const A GetA(void),其中A为用户自定义的数据类型。如果返回值不是内部数据类型,将函数A GetA(void)改写为const A&GetA(void)的确能提高效率。但此时千万千万要小心,一定要搞清楚函数究竟是想返回一个对象的“拷贝”还是仅返回“别名”就可以了,否则程序会出错。
第三,函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数中,目的是为了实现链式表达。例如:
class A
{…
A&operate=(const A&other);//赋值函数
};
A a,b,c; //a,b,c为A的对象
…
a=b=c; //正常的链式赋值
(a=b)=c; //不正常的链式赋值,但合法
如果将赋值函数的返回值加const修饰,那么该返回值的内容不允许被改动。上例中,语句a=b=c仍然正确,但是语句(a=b)=c则是非法的。
3、const修饰成员函数。
任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性。以下程序中,类stack的成员函数GetCount仅用于计数,从逻辑上讲GetCount应当为const函数。编译器将指出GetCount函数中的错误。
class Stack
{
public:
void Push(int elem);
int Pop(void);
int GetCount(void)const;//const成员函数,const只能放在函数的尾部
private:
int m_num;
int m_data[100];
};
int Stack::GetCount(void)const
{
++m_num; //编译错误,企图修改数据成员m_num
Pop(); //编译错误,企图调用非const函数
return m_num;
}
const成员函数的声明看起来怪怪的: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
2、去掉const属性,例: const double value = 0.0f; double* ptr = NULL;怎么才能让ptr指向value?
联系客服