• C++ this指针和const成员函数


    this指针

    1. this指针:成员函数通过一个名为this的隐式形参来访问调用它的那个对象。this由调用该成员函数的对象的地址初始化。
      1 Sales_data total; 
      2 total.isbn(); //等价于Sales_data::isbn(&total),编译器负责把total的地址传递给isbn的隐式形参this
    2. this是一个常量指针,因为this总是指向“这个”对象,不允许改变this中保存的地址。

    const成员函数:

    1. 来源:默认情况下,this是指向类类型非常量版本的常量指针,尽管this是隐式形参,但也需要遵循初始化准则,在默认情况下不能把this绑定到一个常量对象上(普通指针不能指向常量),即我们不能在一个常量对象上调用普通的成员函数。因此,设计类的一个准则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函数不能加 const。
      (1)有 const 修饰的成员函数(指 const 放在函数参数表的后面,而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员;没有 const 修饰的成员函数,对数据成员则是可读可写的。
      (2)除此之外,在类的成员函数后面加 const 还有什么好处呢?那就是常量(即 const)对象可以调用 const 成员函数,而不能调用非const修饰的函数。
    2. 在C++中,只有被声明为const的成员函数才能被一个const类对象调用。
    3. const成员函数可以访问非const对象的非const数据成员,const数据成员,也可以访问const对象内的所有数据成员。
    4. 非const成员函数只可以访问非const对象的任意的数据成员(不能访问const对象的任意数据成员)。
    5. 作为一种良好的编程风格,在声明一个成员函数时,若该成员函数并不对数据成员进行修改操作,应尽可能将该成员函数声明为const 成员函数。
    6. const成员函数可以被对应的具有相同形参列表的非const函数重载:如果只有const成员函数,非const对象是可以调用const成员函数的。当const版本和非const版本的成员函数同时出现时,非const对象调用非const成员函数。
      #include<iostream>
      using namespace std;
      
      class A
      {
      public:
          void f()
          {
              cout << "not const" << endl;
          }
          
          void f() const
          {
              cout << "const" << endl;
          }
      };
      
      int main()
      {
          A a; cout << "a: ";
          a.f();
          const A &b = a;
          cout << "b: ";
          b.f();
          const A *c = &a;
          cout << "c: ";
          c->f();
          A *const d = &a;
          cout << "d: ";
          d->f();
          A *const e = d;
          cout << "e: ";
          e->f();
          const A *f = c;
          cout << "f: ";
          f->f();
          return 0;
      }

      //output:

          a: not const
          b: const
          c: const
          d: not const
          e: not const
          f: const

       
  • 相关阅读:
    《Linux系统free命令的使用》学习笔记
    《postfix MAIL服务搭建(第一篇):》RHEL6
    RHEL(RedHat Enterprise Linux)5/6 ISO镜像下载
    《samba搭建win客户端和linux客户端的区别》
    《怎样实现通过shell脚本将用户踢出系统》
    《DDNS服务器的搭建和案例解决方法》
    《Usermod:user lee is currently logged in 家目录不能改变解决方法》
    你们看不懂为什么写这个博客吧
    JS几种数组遍历方式以及性能分析对比
    从概念到业务来看 To B 和 To C 产品区别在哪?
  • 原文地址:https://www.cnblogs.com/betaa/p/10577960.html
Copyright © 2020-2023  润新知