zoukankan      html  css  js  c++  java
  • C++ Const成员函数

    一些成员函数改变对象,一些成员函数不改变对象。
    例如: 
    int Point::GetY()
    {
     return yVal;

      这个函数被调用时,不改变Point对象,而下面的函数改变Point对象: 
    void Point:: SetPt (int x, int y)
    {
     xVal=x;
     yVal=y;

      

    为了使成员函数的意义更加清楚,我们可在不改变对象的成员函数的函数原型中加上const说明: 
      class Point 


     public:
      int GetX() const;
      int GetY() const;
      void SetPt (int, int);
      void OffsetPt (int, int);
     private:
      int xVal, yVal;
    };
     

      const成员函数应该在函数原型说明和函数定义中都增加const限定: 
        int Point::GetY() const

    {
     return yVal;
    }
    class Set {
    public:
     Set (void){ card = 0; }
     bool Member(const int) const;
     void AddElem(const int);
     //...
    };
    bool Set::Member (const int elem) const
    {
     //...
    }

      非常量成员函数不能被常量成员对象调用,因为它可能企图修改常量的数据成员: 
      const Set s;
      s.AddElem(10); // 非法: AddElem不是常量成员函数
      s.Member(10); // 正确 
      但构造函数和析构函数对这个规则例外,它们从不定义为常量成员,但可被常量对象调用(被自动调用)。它们也能给常量的数据成员赋值,除非数据成员本身是常量。 
    为什么需要const成员函数?
      我们定义的类的成员函数中,常常有一些成员函数不改变类的数据成员,也就是说,这些函数是"只读"函数,而有一些函数要修改类数据成员的值。如果把不改变数据成员的函数都加上const关键字进行标识,显然,可提高程序的可读性。其实,它还能提高程序的可靠性,已定义成const的成员函数,一旦企图修改数据成员的值,则编译器按错误处理。 
    const成员函数和const对象
      实际上,const成员函数还有另外一项作用,即常量对象相关。对于内置的数据类型,我们可以定义它们的常量,用户自定义的类也一样,可以定义它们的常量对象。例如,定义一个整型常量的方法为: 
      const int i=1 ;
    同样,也可以定义常量对象,假定有一个类classA,定义该类的常量对象的方法为:
      const classA a(2);
      这里,a是类classA的一个const对象,"2"传给它的构造函数参数。const对象的数据成员在对象寿命期内不能改变。但是,如何保证该类的数据成员不被改变呢?
      为了确保const对象的数据成员不会被改变,在C++中,const对象只能调用const成员函数。如果一个成员函数实际上没有对数据成员作任何形式的修改,但是它没有被const关键字限定的,也不能被常量对象调用。下面通过一个例子来说明这个问题: 
        class C

    {
     int X;
    public:
     int GetX()
     {
      return X;
     }
     void SetX(int X) 
     {
      this->X = X;
     }
    }; 
    void main()
    {
     const C constC;
     cout<<constC.GetX();
    }

      如果我们编译上面的程序代码,编译器会出现错误提示:constC是个常量对象,它只能调用const成员函数。虽然GetX( )函数实际上并没有改变数据成员X,由于没有const关键字限定,所以仍旧不能被constC对象调用。如果我们将上述加粗的代码:
      int GetX()
    改写成:
      int GetX()const
    再重新编译,就没有问题了。
    const成员函数的使用
      const成员函数表示该成员函数只能读类数据成员,而不能修改类成员数据。定义const成员函数时,把const关键字放在函数的参数表和函数体之间。有人可能会问:为什么不将const放在函数声明前呢?因为这样做意味着函数的返回值是常量,意义完全不同。下面是定义const成员函数的一个实例:
      class X
      {
       int i;
       public:
       int f() const;
      }; 
      关键字const必须用同样的方式重复出现在函数实现里,否则编译器会把它看成一个不同的函数:
      int X::f() const 
      {
       return i;
      } 
      如果f( )试图用任何方式改变i或调用另一个非const成员函数,编译器将给出错误信息。任何不修改成员数据的函数都应该声明为const函数,这样有助于提高程序的可读性和可靠性。

      对象.成员函数

         对象          成员函数       对/错
    1、  const         const           对
    2、  const         non-const       错
    3、  non-const     const           对
    4、  not-const     non-const       对



              成员函数调用成员函数

         成员函数      成员函数       对/错
    5、  const         const           对
    6、  const         non-const       错
    7、  non-const     const           对
    8、  non-const     non-const       对

  • 相关阅读:
    UVA 1513
    《ArcGIS Runtime SDK for Android开发笔记》——问题集:.geodatabase创建,创建时内容缺失问题总结
    《ArcGIS Runtime SDK for Android开发笔记》——问题集:使用TextSymbol做标注显示乱码
    《ArcGIS Runtime SDK for Android开发笔记》——(7)、示例代码arcgis-runtime-samples-android的使用
    《ArcGIS Runtime SDK for Android开发笔记》——(6)、基于Android Studio的ArcGIS Android工程结构解析
    《ArcGIS Runtime SDK for Android开发笔记》——(5)、基于Android Studio构建ArcGIS Android开发环境(离线部署)
    《ArcGIS Runtime SDK for Android开发笔记》——(4)、基于Android Studio构建ArcGIS Android开发环境
    《ArcGIS Runtime SDK for Android开发笔记》——(3)、ArcGIS Runtime SDK概述
    《ArcGIS Runtime SDK for Android开发笔记》——(2)、Android Studio基本配置与使用
    《ArcGIS Runtime SDK for Android开发笔记》——(1)、Android Studio下载与安装
  • 原文地址:https://www.cnblogs.com/zwj911112/p/3875339.html
Copyright © 2011-2022 走看看