浅谈C++中const成员和非const成员的联系和区别

来源:互联网 发布:手机酷狗链接不到网络 编辑:程序博客网 时间:2024/05/23 00:18

        C++中我们经常会碰到const数据成员和const成员函数,他们在使用方面跟非const数据成员和非const成员函数有很大的区别,这里根据自己的经验,谈一下自己看法,如有错误,请大家指教:

      (1):在赋值方面,const数据成员只能采用初始化列表方式,而非数据成员可以采用初始化列表和构造函数体内赋值两种方式。

         class Test
          {
                 public:
                        Test(int x,int y):m_y(y)
                        {
                            m_x = x;   //m_x也可以采用初始化列表方式,对于非内部数据类型最好采用初始化列表方式进行初始化
                       }
               private:
                        int m_x;
                        const int m_y;
          };

    (2):在函数调用方面,const成员函数可以访问const数据成员(本身显示不能被修改)和const成员函数,可以访问非const数据成员,但是不能修改非const数据成员,且不能调用非const成员函数,而非const成员函数则没有限制。

          class Test
          {
                 public:
                        Test(int x,int y):m_y(y)
                        {
                            m_x = x;   //m_x也可以采用初始化列表方式,对于非内部数据类型最好采用初始化列表方式进行初始化
                       }

                       void print_test1( ) const

                       {

                             printf("print_test1 m_y=%d\n",m_y);   //可以访问,本身为const不能被修改

                            printf("print_test1 m_y=%d\n",m_x);   //可以访问

                            ++m_x;   //不能被修改

                           show1();  //可以被调用

                           show2() ;  //不能被调用

                           mut_z++;//mutable数据成员可以在const成员函数中被修改

                       }

                      void print_test2( )

                     {

                          printf("print_test1 m_x=%d\n",m_x);

                          printf("print_test1 m_y=%d\n",m_y);

                         ++m_x;   //可以被修改

                         show1();  //可以被调用

                         show2() ;  //可以被调用

                   } 

                   void show1() const  { ...} 

                  void show2() {...}                                        
               private:
                        int m_x;
                        const int m_y;

                       mutable int mut_z;
          };

         这里需要研究一下其真实原因,对于每个对象的成员函数(这里不包括static成员函数,因为其不属于某个对象),其都有一个隐形的参数,也就是指向该类对象的一个指针,普通的成员函数,this指针类型是A (A类)const * this,其可以改变this所指向的值,但是不能修改this所保存的地址。而对于const成员函数,this指针类型是const A * const *this,其既不能改变this所指向的值,也不能修改this所保存的地址,因此上述就很好理解了。  

      如果要在const成员函数中修改数据成员,怎么办呢,最简单的解决方式就是将数据成员声明为mutable类型。