zoukankan      html  css  js  c++  java
  • C++中的this指针和常量成员函数

    默认情况下,编译器为类的每个成员函数提供了一个隐式形参,该形参指向被调用的成员函数所在的对象。该隐式形参成为this。常量成员函数是一个不会修改调用它的对象的函数。

    1.this指针

      隐式对象形参的实际形参就是调用成员函数的对象的地址。因此在类的成员函数中也可以通过使用( *this )表达式来访问调用它的对象。此外,也可以通过同一个指针访问该对象的任何成员

      示例代码:

      void Example::setValue(int x)

      {

        this->x = x;   //或(*this).x = x; 注意要加括号

      }

    2.常量成员函数

      通过引用或通过指针传递给函数的形参可能会被该函数修改。但是如果在形参中使用const关键字,则可以防止调用的函数修改它。例如:某个函数的声明如下:

      void fun(const string &str);

      该函数采用了一个字符串对象的引用作为形参,但是不能修改该对象。有一个类似的机制,可以用来保护隐含的形参*this,使它不会被成员函数修改。当定义成员函数时,可以在形参列表后面防止const关键字,这实际上就是告诉编译器,该成员函数未被允许修改其对象。如果成员函数定义在类的外面,则类内的声明和类外的定义都必须具有const,示例:

      class ConstExample

      {

        int x;

        public:

          ConstExample(int a) { x = a;}

          void setValue(int);

          int getValue() const;

      };

      getValue函数定义语句应如下:

      int ConstExample::getValue() const

      {   return x;   }

      具有常量参数x的函数无法转向,并将x作为非常量形参传递给另一个函数。换句话说,承诺不修改x的函数不能将x传递给另一个函数,除非第二个函数也承诺不修改x。这种情况下有时也可能会以不明显的方式发生。以下程序使用带有常量参数的函数来打印数组的第一个元素,但是它不会编译,因为它在const的使用方面不一致:

     

    #include<iostream>

    using namespace std;

    class K
    {
    public :
      void output() //丢失了const
      {
      cout<<"Output of a K object"<<endl;
      }
    };

    void outputFirst(const K arr[])
    {
      arr[0].output();
    }

    int main()
    {
      K arr[] = { K() };
      outputFirst(arr);
      return 0;
    }

    运行显示错误:

    该程序之所以不能编译,是因为编译器不能保证const数组的元素在作为隐含的this形参传递给output成员函数时,不会被修改。

    要让该程序可以编译,则可以使output()成员函数变成一个const成员函数,以表示它有一个作为常量的this形参。

  • 相关阅读:
    html file 表单样式(css过滤器实现)
    网页a标签
    Criteria示例
    数类型转换顺序
    Mysql命令行添加用户
    MySQL中导出用户权限设置的脚本
    mysql 命令行登录详解
    mysql的auto-rehash简介
    UltraEdit中的特殊字符
    ps aux详解(进程状态说明)
  • 原文地址:https://www.cnblogs.com/ruigelwang/p/12618781.html
Copyright © 2011-2022 走看看