zoukankan      html  css  js  c++  java
  • 类 this指针 const成员函数

    C++ Primer 第07章 类

    7.1.2

    ​Sales_data类的定义如下:

    1. #ifndef SALES_DATA_H
    2. #define SALES_DATA_H
    3. #include <string>
    4. #include <iostream>
    5. class Sales_data {
    6. public:
    7. std::string isbn() const {return bookNo;}
    8. Sales_data& combine(const Sales_data&);
    9. double avg_price() const;
    10. private:
    11.     std::string bookNo;
    12. unsigned units_sold = 0;
    13. double revenue = 0.0;
    14. };
    15. Sales_data add(const Sales_data&, const Sales_data&);
    16. std::ostream &print(std::ostream&, const Sales_data&);
    17. std::istream &read(std::istream&, const Sales_data&);
    18. #endif

    注意第8行:

    1. std::string isbn() const {return bookNo;}

    这里const的作用是修改隐式this指针的类型,默认情况下,this的类型是指向类类型非常量版本的常量指针。例如在Sales_data成员函数中,this的类型是Sales_data *const,即类一旦实例化一个对象后,this指向这个对象,是不能改变的,但是对象本身可以变(通俗的讲,this保存的地址不能变,但是*this指向的内容是可以变的,所以*this是非常量,不可以将this绑定一个常量对象),举个例子:

    1. const int a = 5;     //a为整型常量
    2. int *const pa = &a; //pa是常量指针,但是*pa可以变,但是a又是常量,所以报错

    所以这样就会带来一个问题:我们不能在一个常量对象上调用普通成员函数,测试如下:

    去掉const,测试代码如下:

    1. #include "Sales_data.h"
    2. int main()
    3. {
    4. Sales_data data1;
    5. std::cout << data1.isbn() << std::endl;
    6. return 0;
    7. }

    结果OK,data1是非常量,调用普通成员函数没有问题,下面做一个改变,将data1声明成常量

    1. #include "Sales_data.h"
    2. int main()
    3. {
    4. const Sales_data data1;
    5. std::cout << data1.isbn() << std::endl;
    6. return 0;
    7. }

    ​CodeBlocks编译报错

    1. error: passing 'const Sales_data' as 'this' argument of 'std::string Sales_data::isbn()' discards qualifiers [-fpermissive]

    如果isbn是一个普通函数而this是一个普通指针参数,则我们应该把this声明成const Sales_data *const。毕竟,在isbn的函数体内不会改变this所指向的对象,所以把this设置为指向常量的指针有助于提高函数的灵活性。

    然而,this是隐式的并且不会出现在参数列表中,所以在哪儿将this声明成指向常量的指针就成为我们必须面对的问题。C++语言的做法是允许把const关键字放在成员函数的参数列表之后,此时,紧跟在参数列表后面的const表示this是一个指向常量的指针。像这样使用const的成员函数被称作常量成员函数(const member function)。

    可以把isbn的函数体想象成如下形式:

    1. //伪代码,说明隐式的this指针是如何使用的
    2. //下面的代码是非法的:因为我们不能显示地定义自己的this指针
    3. //谨记此处的this是一个指向常量的指针,因为isbn是一个常量成员
    4. std::string Sales_data::isbn(const Sales_data *const this)
    5. { return this->isbn; }

    ​因为this是指向常量的指针,所以常量成员函数不能改变调用它的对象的内容。在上例中,isbn可以读取调用它的对象的数据成员,但是不能写入新值。

    note:​常量对象,以及常量对象的引用或指针都只能调用常量成员函数。





  • 相关阅读:
    几种典型程序Button处理代码的定位转
    sql server索引使用效率评估
    sql server查询死锁的sql语句
    SqlServer 查询计划
    批量删除Word中的回车符号
    数据在机器中的表示
    win32汇编窗口程序设计[05]获取屏幕分辨率
    清理win7任务栏图标
    Win32汇编窗口程序设计[06]—“Hello Win32ASM”改进版
    关于ASCII码的几点小结
  • 原文地址:https://www.cnblogs.com/little-sjq/p/9fed5450f45316cf35f4b1c17f2f6361.html
Copyright © 2011-2022 走看看