1.1.用途:
1)const修饰数据类型:常量定义-限制该变量不可修改
2)const修饰函数:
a)修饰参数则参数不可修改;
b)修饰返回值:常量
用const修饰返回值为对象本身(非引用和指针)多用于二目操作符重载函数并产生新对象
3)const在类用法:
a)const成员变量=常量,必须在类内初始化
b)成员函数void A::fun()const;
const修饰成员函数中不能修改成员变量,不能调用非const修饰函数
c)const修饰类对象:常量对象只能调用常量函数,别的成员函数都不能调用
1.2.说明:
1)指针pointer是用来指向实际内存地址的变量,是整型
2)引用reference是变量别名,函数直接访问参数(而非副本)
是受限制指针类型,是指针一个子集,是指针功能一种高层实现
3)允许在类中初始化const,static const变量,普通变量,static变量则不可;
1.3.使用建议
1)建议尽量使用const,避免赋值操作错误
2)参数中const应使用引用或指针,而非一般对象实例
3)不要轻易的将函数返回值类型定为const;
4)除重载操作符外不要将返回值类型定为对象const引用;
2.实例:
实例1:
//1.修饰基本数据类型
const int a=10; //等价int const a=10;
const int arr[3]={1,2,3};
//2.const修饰指针(*):
int a=1,*p= &a; &*p == *&p;
const int* p; //指针变量->常量 ==int const *p
int* const p ; //常量指针->变量
const int* const p ; //常量指针->常量
说明:
如const位于星号*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
如const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。
//3.const修饰引用(&):
const int &a=x;//==int const &a=x;
int &const a=x;//警告:不合法语法-忽略&const ==int a=x;
实例2:const应用到函数中
//1.函数输入参数:参数不可修改
void fun0(const A* a ); //指针:*a只读不能修改
void fun1(const A& a); //引用:禁止对引用对象a修改
//2.修饰返回值:返回值为常量
const A fun2(); //const按照"修饰原则"进行修饰,起到相应的保护作用
const A *fun3();
//3.类中的成员函数:
A fun4()const; //不能修改所在类的的任何变量
实例3:类中定义常量
//1.使用枚举类型
class A {
enum { SIZE1 = 10, SIZE2 = 20 }; // 枚举常量
int array1[SIZE1];
int array2[SIZE2];
};
//2.使用const或static
//C++11禁在类声明中初始化static非const类型数据成员
// using y++11 standard
class B {
public:
//static int g = 1; // Error
static int g; //静态变量必须在类外初始化
static const int x = 2; // 常量必须在定义时初始化
const int y = 3; // Ok in C++11
int z = 4; // Ok in C++11
public:
B() :y(-3) { } // Ok in C++11
int const_get_c() const{ return y; }
const int get_ci() { return y; }
int get_c(){return y;}
void set_z(int z) { this->z = z; }
};
int B::g = 1;
int main()
{
B b;
cout << (b.g+b.x +b.y+b.z) << endl;//1,2,-3,4==4
b.set_z(5);
cout << b.z << endl; //5
const B c;
c.const_get_c();
//c.get_c(); //error
//c.get_ci(); //error
return 0;
}