【c++】常对象、常数据成员、常成员函数总结

常数据成员

 ◆ 常数据成员必须进行初始化,并且不能被更新。
 ◆ 常数据成员不能在声明时赋初始值(普通数据成员也是),常数据成员必须在构造函数初始化列表进行初始化;普通数据成员在初始化列表和函数体中初始化均可。
 ◆ PS:类的成员对象若要传入参数初始化,则必须在构造函数初始化列表进行;(成员对象:当一个类的成员是另一个类的对象时,这个对象就叫成员对象。)

常对象

 ◆ ⭐常对象可以调用常成员函数,不能调用非const成员函数;非const对象,可以调用普通成员函数和常成员函数。
 ◆ 常对象的成员函数不一定都是常成员函数;同样的常对象的数据成员不一定都是常数据成员。
 ◆ 常对象一旦初始化,常对象的数据成员便不允许修改,而不是说常对象的数据成员都是常数据成员。
 ◆ PS:定义常对象有两种方法,1. Point const a; 2. const Point a;(同样的,定义变量或指针时,const放前放后意义一样,如:1. const double a; double const a; 2. const int *p; int const *p; 但是定义指针常量时,只能用 int * const p;)

常成员函数

 ◆ 常成员函数不更新对象的数据成员。
 ◆ 常成员函数的const关键字可以被用于参与对重载函数的区分。
 ◆ ⭐通常非const成员函数需要定义一个const版本的重载函数,以方便定义常对象后调用常成员函数。
  ◈ 如果常对象调用的常成员函数返回的是指向当前对象的指针(或返回的是当前对象),那么此常成员函数的声明的返回类型要加const,例如:

    ◊ 成员函数返回指向当前对象的指针
      const *Point fun1();    //非const成员函数的类内声明;
      const *Point fun1() const; //习惯上要再声明一个常成员函数作重载函数,注意到此函数声明有两个const;

    ◊ 成员函数返回指向当前对象
      const Point fun1();    //非const成员函数的类内声明;
      const Point fun1() const; //习惯上要再声明一个常成员函数作重载函数,注意到此函数声明有两个const;

    ◊ ⭐注意,如果一个类中声明以下4个重载函数:
      ① Point fun1();
      ② const Point fun1();
      ③ Point fun1() const;
      ④ const Point fun1() const;
     【解析】①和②是冲突的,因为无法区分仅按返回类型区分的重载函数;③和④是冲突的,也是因为无法区分仅按返回类型区分的重载函数。
     所以正确的重载函数搭配有3种:

      ◊ ①和③搭配:
        Point fun1();             //函数返回非const对象
        Point fun1() const;          //函数返回非const对象
       [解析]适用于定义常对象后调用常成员函数,常成员函数返回类型是非const的Point类对象。

      ◊ ①和④搭配(这里把返回类型改为指针,因为常用):
        Point *fun1() {return this; };      //函数返回指向本对象的指针
        const Point *fun1() const { return this; };//函数返回指向本常对象的指针,第一个const说明返回的是指向常对象的指针,第二个const说明此函数是常函数

       [解析]适用于定义常对象后调用常成员函数,常成员函数返回类型是常Point类对象(如return *this;)。

      ◊ ②和④搭配:
        const Point fun1();          //函数返回常对象
        const Point fun1() const;       //函数返回常对象
       [解析]适用于定义常对象后调用常成员函数,常成员函数返回类型是常Point类对象。

       ②和③搭配:
        const Point fun1();
        Point fun1() const;
       [解析]虽然搭配合法,但是似乎不存在这种搭配。

————————— 本文结束 感谢您的阅读 —————————
谢谢你请我喝咖啡ლↂ‿‿ↂლ(支付宝扫一扫即可领红包, 消费时可抵现! 你省钱, 我赚钱, 多谢支持~)