const的用法详解
const作为c++中的关键字,用法非常的灵活,通过使用const可以大大改善程序的健壮性,因此本文总结一下const的用法,方便日后查找
const的作用
一、定义常量
便于进行类型检查。const常量有数据类型,编译器可以进行类型检查,而宏常量没有数据类型,编译器只进行字符替换,没有安全类型检查,并且在字符替换时可能产生意料不到的错误。
const int max = 100;
二、修饰函数参数
const用来修饰函数参数,如果修饰的参数为按值传參,那么传入的参数不可以被修改,实际上意义并不是太大,如果参数为指针的时候,那么传入将会是实参,为了保证实参的值不会受到影响使用const进行保护,使得在函数体内不会改变实参的数据。
const指针可以接受非const指针参数,但是非const指针不能接受const指针参数。
常量指针:const char* a;
不能通过指针a去修改a指向的对象的内容
指针常量
char * const a;
不能修改a,但可以修改a指向的对象的内容
二者都不可变
const char* const a;
三、用于类相关的
- const 修饰成员变量
const修饰类的成员函数,表示成员常量,不能被修改,同时它只能在初始化列表中赋值。
class A
{
…
const int nValue; //成员常量不能被修改
…
A(int x): nValue(x) { } ; //只能在初始化列表中赋值
}
- const修饰成员函数
const修饰类的成员函数,则该成员函数不能调用类中任何非const成员函数,因为非const函数可能会修改对象的数据成员。一般写在函数的最后来修饰。
class A
{
void function() const; //常成员函数, 它不改变对象的成员变量.
//也不能调用类中任何非const成员函数。
}
对于const类对象/指针/引用,只能调用类的const成员函数,因此,const修饰成员函数的最重要作用就是限制对于const对象的使用。
a. const成员函数不被允许修改它所在对象的任何一个数据成员。
b. const成员函数能够访问对象的const成员,而其他成员函数不可以。
(3)const修饰类对象/对象指针/对象引用
返回指向const对象的引用
返回对象会调用复制构造函数,但是返回引用不会,因此将返回值定义为引用类型
const Vector & max(const Vector& v1, const Vector& v2) {
if (v1.mgval() > v2.mgval()) {
return v1;//引用指向的对象在函数调用时存在,不是局部变量,因此可行
}
return v2;
}
返回const引用
;//引用指向的对象在函数调用时存在,不是局部变量,因此可行
}
return v2;
}
**返回const引用**
如果方法或函数要返回局部对象,则应返回对象,而不是指向对象的引用。在这种情况下将使用复制构造函数来生成返回的对象。如果方法或函数要返回一个没有公有复制构造函数的类的对象,它必须返回一个指向这种对象的引用。最后,有些方法和函数可以返回对象也可以返回指向对象的引用,在这种情况下,应首选引用,因为这种效率更高