今日写向量类,不想对const的使用又有了些生疏,竟然有些 地方判断错误,于是又重新整理了一下const的要点,如下。
1.修饰常量:const int val = 100.
const常量和#define定义的宏常量的区别在于:const常量用数据类型,因此编译器会对其进行类型安全检查,而宏常量没有类型,当然不会进行检查,所以相比之下,const常量更为安全一些。
2.修饰指针:
<1> const type *var 或者 type const *var
此种类型const限定的是指针指向的对象:"指向const对象的 指针"。
eg:
/*****
测试const 与指针的用法
测试const type * var
*****/
#include<iostream>
using namespace std;
int main()
{
int a=0,b=1;
const int *p=&a;
a=2;
p=&b;
//*p=3;error: assignment of read-only location
cout << "a=" << a << endl;
cout << "*p=" << *p << endl;
}
/*****
测试结果:
通过const type * var_name或者type const * var_name
声明的指针具有以下特点:
1.可以修改指针指向的对象
2.不可以通过指针修改它指向的对象
3.指针指向的对象也可以被修改
****/
<2> type * const var:
此类是const指针:const指针所指的地址不能改变,即指针的 指不能变。
eg:
/*****
测试const 与指针的用法
测试type * const var
*****/
#include<iostream>
using namespace std;
int main()
{
int a=0,b=1;
int * const p=&a;
a=2;
//p=&b;error:assignment of read-only location
*p=3;
cout << "a=" << a << endl;
cout << "*p=" << *p << endl;
}
/*****
测试结果:
const声明的是指针,所以指针指向的对象唯一确定,不能改变
但是对象值是可以改变的。
*****/
<3>const type *const var:
指向const变量的const指针。
3.const修饰类的数据成员:
类声明中不能初始化const数据成员,const数据成员只能在构造函数的初始化列表中进行初始化。
4.const修饰函数返回值:
const修饰函数返回值,如果返回值是某个对象时,此时多用于操作符的重载。除此之外,最好不要用 修饰返回值为对象类型或者对象引用的情况。
<1>函数返回const指针,只能将指针赋值给const修饰的同类型指针变量
<2>函数返回值为值传递时,函数会把返回值赋值给外部的临时变量,此时用const没有任何意义。
<3>引用返回,很少用到,要保证返回值为一个全局变量。一般只出现在类的赋值函数中,以达到实现链式表达的目的。
5.const修饰成员函数:
f( ) const:用来保证数据成员在函数中不会被更改,但是用关键字mutable可以突破这种限制。
总结:
1.任何可能的情况下都应该使用const
2.注意const赋值操作容易出现的错误
3.不要轻易将函数返回值定义为const,除非必要
4.非const引用必须有精确匹配的左值,而const引用不必
5.const在类成员函数中的灵活用法
《任何可能的情况下都应该使用const》
"const修饰成员函数"
用到