C++ 类(const修饰普通成员函数)
const修饰普通成员函数
我们知道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 成员函数。
1 int myFun(void) const //const修饰的是成员函数 2 {}//函数内部不能修改 普通成员变量 mutable修饰时例外
1 class Data 2 { 3 private: 4 int data; 5 6 mutable int num; 7 public: 8 //遍历 成员的函数 不会去修改成员的值 9 //如果函数不会更改成员数据 就让编译器知道 这是一个const函数 10 void myPrintData(void) const 11 { 12 //data =10000;//err const修饰函数 函数不能操作普通成员变量 13 cout<<this->data<<endl; 14 //cout<<data<<endl; 15 16 //mutable修饰的成员变量 可以修改 17 num = 200; 18 } 19 20 Data() 21 { 22 cout<<"无参构造"<<endl; 23 } 24 Data(int data) 25 { 26 this->data =data; 27 cout<<"有参构造"<<endl; 28 } 29 Data(const Data &ob) 30 { 31 this->data = ob.data; 32 cout<<"拷贝构造"<<endl; 33 } 34 ~Data() 35 { 36 cout<<"析构函数"<<endl; 37 } 38 }; 39 void test02() 40 { 41 Data ob1(100); 42 ob1.myPrintData(); 43 }
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开辟空间