我们知道this指针指向的是具体的对象,普通的成员函数存在(加深记忆),设计this指针的时候格式为*const this(常量指针)。
const修饰变量一般有两种方式:const T a,或者 T const *a,这两者都是一样的,主要看const位于的左边还是右边,这里不再赘述,主要来看一下当const修饰类的成员函数时,成员函数有什么特点。
类的成员函数后面加 const ,表面这个函数不会对这个类对象的数据成员(准确的说是非静态数据成员)作任何改变。
在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加const,而对于改变数据成员的成员函数不能加const。所以const关键字对成员函数的行为作了更加明确的限定:
1.有const修饰的成员(指 const 放在函数参数表的后面,而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员;
2.在类的成员函数后面加 const 还有什么好处,那就是常量(即const)对象可以调用const成员函数,而不能调用非const 成员函数。
int myFun(void) const //const修饰的是成员函数
{}//函数内部不能修改 普通成员变量 mutable修饰时例外
class Data
{
private:
int data;
mutable int num;
public:
//遍历 成员的函数 不会去修改成员的值
//如果函数不会更改成员数据 就让编译器知道 这是一个const函数
void myPrintData(void) const
{
//data =10000;//err const修饰函数 函数不能操作普通成员变量
cout<<this->data<<endl;
//cout<<data<<endl;
//mutable修饰的成员变量 可以修改
num = 200;
}
Data()
{
cout<<"无参构造"<<endl;
}
Data(int data)
{
this->data =data;
cout<<"有参构造"<<endl;
}
Data(const Data &ob)
{
this->data = ob.data;
cout<<"拷贝构造"<<endl;
}
~Data()
{
cout<<"析构函数"<<endl;
}
};
void test02()
{
Data ob1(100);
ob1.myPrintData();
}
2、const修饰对象 叫常对象
class Data
{
private:
int data;
mutable int num;
public:
//遍历 成员的函数 不会去修改成员的值
//如果函数不会更改成员数据 就让编译器知道 这是一个const函数
void myPrintData(void) const
{
//data =10000;//err const修饰函数 函数不能操作普通成员变量
cout<<this->data<<endl;
//cout<<data<<endl;
//mutable修饰的成员变量 可以修改
num = 200;
}
//编译器认为 普通成员函数 存在修改成员变量 可能
void setData(int data) const
{
//this->data = data;
return;
}
Data()
{
cout<<"无参构造"<<endl;
}
Data(int data)
{
this->data =data;
cout<<"有参构造"<<endl;
}
Data(const Data &ob)
{
this->data = ob.data;
cout<<"拷贝构造"<<endl;
}
~Data()
{
cout<<"析构函数"<<endl;
}
};
void test03()
{
//常对象
const Data ob1(200);
//常对象 只能调用const修饰的函数 遍历成员数据
ob1.setData(20000);
ob1.myPrintData();
}
总结:
1)const成员函数可以访问非const对象的非const数据成员、const数据成员,也可以访问const对象内的所有数据成员;
2)非const成员函数可以访问非const对象的非const数据成员、const数据成员,但不可以访问const对象的任意数据成员;
3)作为一种良好的编程风格,在声明一个成员函数时,若该成员函数并不对数据成员进行修改操作,应尽可能将该成员函数声明为const 成员函数。
4)如果只有const成员函数,非const对象是可以调用const成员函数的。当const版本和非const版本的成员函数同时出现时,非const对象调用非const成员函数。
const int num = 10;//系统不会给num开辟空间 num被放入符号表中 如果后期对&num 这时系统才会给num开辟空间