C++ this指针以及运算符重载(operator)
发布日期:2021-05-07 15:11:17 浏览次数:23 分类:精选文章

本文共 2834 字,大约阅读时间需要 9 分钟。

this指针与运算符重载技术

在C++编程中,this指针是一个非常重要的概念,它既是成员函数的隐式参数,也是区分成员变量和参数的关键工具。通过this指针,开发者可以对对象进行操作,实现自定义行为。

this指针的特点

  • 在成员函数中可通过this指针区别成员变量与形参变量
  • this可以显示调用
  • 示例代码

    class Cperson {private:    int age;    float height;public:    void InitPerson(int age, float height) {        this->age = age;        this->height = height;    }};

    返回this成员函数概念:返回值是this,也就是返回调用此成员函数的对象的自身引用,返回值类型为对象引用类型

    示例代码

    class Person {private:    int age;public:    Person& setAge(int age) { // 返回自身引用        this->age = age;        return *this; // 返回*this(自身引用)    }};

    从const成员函数返回this如果一个const成员函数返回this,那么此函数的返回值类型是常量引用

    示例代码

    const Person& setAge(int age) const;

    运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型

    运算符重载的3种实现方式

  • 成员函数:私有、公有、保护都可以
  • 友元函数:同上
  • 全局函数:只能访问公有的
  • 运算符重载的规则以下运算符不支持重载:

    • . (类属运算符)
    • :: (作用域运算符)
    • sizeof
    • ?: (三目运算符)
    • #: (预处理运算符)

    只能用成员函数重载的运算符:

    • = (赋值运算符)
    • () (强制类型转换)
    • [] (子对象访问)
    • new/delete (内存管理)

    只能用友元、全局函数重载的运算符:

    • << >> (输入输出)

    +=、-=、=运算符返回值为引用类型(&&)函数执行完之后返回的是*this(对象本身)。如果不加&,则返回的是临时对象

    注意事项:

    • 前置++、--,返回值为引用
    • 后置++、--,返回值不为引用

    ++、--运算符的重载为了区别前置和后置:

    • 后置++的参数为int,前置++无参数

    前置++、--,返回值为引用。后置++、--,返回值不为引用

    示例代码

    class Cperson {private:    int data;public:    Cperson& operator++() { // 前置++,返回值为引用        data++;        return *this;    }    Cperson operator++(int) { // 后置++,返回值不为引用        Cperson temp = *this;        data++;        return temp;    }};

    ==、!=运算符的重载用途:这两个运算符用来判断两个类对象中数据成员的值是否相等/不相等

    设计规则:

  • 通常情况下,==运算符应该具有传递性
  • 如果实现了==运算符,则!=运算符可以直接在return语句中应用刚才实现的==运算符来简化书写
  • 如果用成员函数实现只能有一个参数,用友元、全局函数实现是两个参数
  • 示例代码

    class Cperson {private:    int id;    int age;public:    Cperson(int Id, int Age) : id(Id), age(Age) {}    int getId() const;    int getAge() const;    friend bool operator==(const Cperson& p1, const Cperson& p2) {        return (p1.getId() == p2.getId()) && (p1.getAge() == p2.getAge());    }    friend bool operator!=(const Cperson& p1, const Cperson& p2) {        return !(p1 == p2);    }};int Cperson::getId() const { return id; }int Cperson::getAge() const { return age; }

    输入输出运算符的重载输入输出运算符的重载不能用成员函数实现,一般用友元实现

    重载输出运算符<<<参数:

  • 一个非常量ostream对象的引用(ostream是非常量是因为向流写入内容会改变其状态)
  • 一般来说是一个常量的引用,该常量是我们想要打印的类类型(使用引用的原因是我们希望避免复制实参。使用常量是因为不会改变对象的内容)
  • 返回值:返回它的ostream形参

    重载输入运算符>>>参数:

  • 是运算符将要读取的流的引用
  • 将要读入到的(非常量)的引用(使用非常量是因为输入运算符本身的目的就是将数据读入到这个对象中)
  • 返回值:某个给定流的引用

    输入时可能产生的错误:

  • 输入的类型不符
  • 当读取操作达到文件末尾或者遇到输入流的其它错误时也会失败
  • 示例代码

    class Cpoint {private:    int x;    int y;public:    friend ostream& operator<<(ostream& os, const CMyPoint& pt) {        os << pt.x << " " << pt.y;        return os;    }    friend istream& operator>>(istream& is, const CMyPoint& pt) {        is >> pt.x >> pt.y;        return is;    }};

    ()函数调用运算符的重载如果类重载了函数调用运算符,那么我们在使用该对象时就如同调用一个函数一样

    注意:

    • ()运算符与对象初始化时调用构造函数不是一个东西、因此()函数调用运算符不能在类初始化时使用,会与构造函数冲突

    示例代码

    struct absInt {    bool operator()(int value) {        return value < 0 ? true : false;    }};int main() {    absInt a;    printf("%d\n", a(-1)); // 打印1    return 0;}
    上一篇:C++ throw、try、catch、noexcept
    下一篇:C++ 一致性初始化、初值列(initializer_list)及成员变量初始化方式

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2025年03月23日 17时07分16秒