zoukankan      html  css  js  c++  java
  • c/c++笔试题——const类型的成员函数内部如何改变成员变量

    转载自:http://blog.csdn.net/hsujouchen/article/details/4401304

          在C++中,由const修饰的成员函数的函数体内部,是不能够对成员变量进行修改的。这个特性被用来保证某些成员函数在实现过程中,避免由于程序员大意而对数据进行了错误的修改;同时也说明此成员函数是非修改性的。如只需要返回成员变量的成员函数就被声明为const类型(const的位置在函数定义参数列表之后)

          推广开来,在const成员函数中也不能够调用非const的成员函数。这是因为非const成员函数可能会改变成员变量的值,这与const成员函数的定义相违背。

          但是在某些情况下,需要在const函数中改变成员变量。这就需要把成员变量设置成mutable类型。如

     

      class C

      {

      public:

          void func(const int& p) const

          {

             i = p;

          }

      private:

        mutable int i;

    };

     

        如果变量i不声明为mutable类型,则编译不会通过。

        如果成员变量是一个类类型或者结构类型,而在const函数中调用这些变量的成员函数,除了用mutable声明外,还可以用一种变通的方法:

     

      class D

     {

        public:

           void op(){}

     }

      class C

      {

      public:

          void func(const int& p, D& d) const

          {

             i = p;

             d.op();

          }

      private:

        mutable int i;

        D                cd;

      };

     

      然后在调用时,参数D& d以*this作为输入,也可以达到调用非const函数的作用。

      P.S 最近阅读相关的文章,又学到了一种方法,能够使得在const成员函数中调用非const成员函数。就是使用const_cast<>运算符。它能够使得const去掉const的属性,使得violate属性去掉violate属性。上面的例子就可以写成。

          void func() const

         {

              const_cast<D*>(&cd)->op();

         }

         同样能够编译通过。


  • 相关阅读:
    Nginx、PCRE和中文URL(UTF8编码)rewrite路径重写匹配问题
    Nginx 使用中文URL,中文目录路径
    再谈Nginx Rewrite, 中文URL和其它
    事务管理
    commons-dbcp连接池的使用
    JDBC操作简单实用了IOUtils
    JDBC进行处理大文件和批处理
    mysql日期函数(转)
    mysql约束(自己原先总结的有点不准)
    mysql笔记(前面自己写的不标准有些地方)
  • 原文地址:https://www.cnblogs.com/java20130723/p/3212068.html
Copyright © 2011-2022 走看看