美文网首页
黑马C++视频笔记《运算符重载》

黑马C++视频笔记《运算符重载》

作者: 井底蛙蛙呱呱呱 | 来源:发表于2021-01-05 19:42 被阅读0次
/* 运算符重载
 * 概念:对已有的运算符进行重新定义,赋予其另一种功能,以适应不同的数据类型.
 *
 * 加号运算符(operator+)重载,有两种方式:
 * (1)全局函数进行运算符重载;
 * (2)类函数进行运算符重载;
 *
 * 左移运算符(<<, 也即 ostream)重载
 *  - 左移运算符重载一般采用全局函数的形式,因为若采用类函数,则调用形式变成了 class.cout,也即class << cout, cout到了右边了;
 *  - 配合友元可以访问类的私有成员;
 *  - 重载函数:ostream & operator<<(ostream & cout, Person & p){...; return cout}  // 注意这里一定要返回
 *
 * 递增运算符(operator++)重载
 *  (1) 前置递增运算符重载
 *      - 为保持一致是对同一个对象进行重载,需要返回引用;
 *      - 前置运算符重载时没有参数;
 *      - 语法:Person& operator++(){this->age++; return *this}
 *
 *  (2) 后置运算符重载
 *      - 后置递增返回的是值,可通过下面的代码进行理解,若返回局部变量temp,局部变量temp在函数运行后就会被回收释放,会引发报错,因此返回值;
 *      - 后置递增运算符重载时有一个占位符参数,以区别前置递增运算符;
 *      - 语法:Person& operator++(int){
 *                 Person temp = *this->age; // 记录当前值
 *                 this->age++; // 执行递增操作
 *                 return temp; // 返回当前值(未执行递增操作)
 *                 }
 *  注:前置递增返回引用,后置递增返回值。
 *
 *
 *  赋值运算符(operator=)重载:
 *  类对象赋值运算符进行重载时,需要注意深拷贝浅拷贝问题(即堆中变量的释放):
 *  Person& operator=(Person &p){
 *      // 先判断是否有属性在堆区,若有则先释放干净再进行深拷贝
 *      if (this->m_age != NULL){
 *          delete this->age;
 *          this->age = NULL;
 *      }
 *      // 深拷贝
 *      this->age = new int(p.age);
 *      return *this;
 *  }
 *
 *
 * 关系运算符(operator==, operator!=)重载
 *
 *
 * 函数调用运算符(operator())重载
 * (1)由于重载后使用的方式非常像函数的调用,因此称为仿函数;
 * (2)仿函数没有固定写法,非常灵活。
 * 栗子:class myPrint{
 * void operator()(string test){
 *     cout << test << endl;
 * }
 * }
 */

栗子:

//
// Created by shexuan on 2021/1/5.
//

#include <iostream>
#include <string>
using namespace std;

class Person{
public:

    Person(){
        cout << "构造函数无参初始化" << endl;
    }

    Person(int age, int height): m_age(age), m_height(height){
        cout << "构造函数列表初始化" << endl;
    }

    // 相当于 +=
//    Person &operator+(Person &p){
//        this->m_age = this->m_age + p.m_age;
//        this->m_height = this->m_height + p.m_height;
//        return *this;
//    }

    // 正常写法
    Person operator+(Person &p){
        Person temp;
        temp.m_age = this->m_age + p.m_age;
        temp.m_height = this->m_height + p.m_height;
        return temp;
    }

    int m_age;
    int m_height;
};

void test1(){
    Person p1(19, 180);
    Person p2(10, 110);

    Person p3 = p1 + p2;
    cout << "p1.age: " << p1.m_age << " p1.height: " << p1.m_height << endl;
    cout << "p3.age: " << p3.m_age << " p3.height: " << p3.m_height << endl;
    cout << "p1地址:" << &p1 << endl;
    cout << "p3地址:" << &p3 << endl;
}


int main(){
    // test1();
    for (int i=0; i<10; ++i){
        cout << i << endl;
    }
}

相关文章

  • 黑马C++视频笔记《运算符重载》

    栗子:

  • 第十一章 使用类

    运算符重载 运算符重载是一种形式的C++多态。运算符重载将重载的概念扩展到运算符上,允许赋予C++运算符多种含义。...

  • 1.2.15_C++ 关系运算符重载

    C++ 重载运算符和重载函数 C++ 语言支持各种关系运算符( < 、 > 、 <= 、 >= 、 == 等等),...

  • C++ 运算符重载

    运算符重载将重载的概念扩展到运算符上,允许赋予C++运算符多种含义。实际上,很多C++运算符已经重载。将*运算符用...

  • C++运算符重载

    C++运算符重载的实质:运算符重载的实质就是函数重载或函数多态。运算符重载是一种形式的C++多态。目的在于让人能够...

  • C++运算符重载-下篇 (Boolan)

    C++运算符重载-下篇 (Boolan) 本章内容:1. 运算符重载的概述2. 重载算术运算符3. 重载按位运算符...

  • C++运算符重载-上篇 (Boolan)

    C++运算符重载-上篇 (Boolan) 本章内容:1. 运算符重载的概述2. 重载算术运算符3. 重载按位运算符...

  • C++ 重载运算符

    C++重载运算符

  • C++重载

    重载 C++语言规定: 重载的运算符要保持原运算符的意义。只能对已有的运算符重载,不能增加新的运算符。重载的运算符...

  • 1.2.17_C++ ++ 和 -- 运算符重载

    C++ 重载运算符和重载函数 递增运算符( ++ )和递减运算符( -- )是 C++ 语言中两个重要的一元运算符...

网友评论

      本文标题:黑马C++视频笔记《运算符重载》

      本文链接:https://www.haomeiwen.com/subject/jziwoktx.html