c/c++语言开发共享C++ 类(const修饰普通成员函数)

const修饰普通成员函数 我们知道this指针指向的是具体的对象,普通的成员函数存在(加深记忆),设计this指针的时候格式为*const this(常量指针)。 const修饰变量一般有两种方式:const T *a,或者 T const *a,这两者都是一样的,主要看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开辟空间

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/600152.html

(0)
上一篇 2021年5月9日
下一篇 2021年5月9日

精彩推荐