C++从入门到精通——类的6个默认成员函数之赋值运算符重载

马肤
这是懒羊羊

赋值运算符重载

  • 前言
  • 一、运算符重载
    • 定义
    • 实例
    • 注意要点
    • 函数重载与运算符重载的区别
      • 不同点
      • 相似点
      • 总结
      • 二、赋值运算符重载
        • 赋值运算符重载格式
        • 赋值运算符重载要点
          • 重载要点
          • 传值返回和传址返回要点
          • 三、前置++和后置++重载
            • 示例
            • 概念
            • 四、深挖operator
              • 友元函数
              • 模拟实现
              • 友元函数

                前言

                类的6个默认成员函数:如果一个类中什么成员都没有,简称为空类。

                空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。

                默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。

                class Date {};
                

                C++从入门到精通——类的6个默认成员函数之赋值运算符重载,在这里插入图片描述,词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,操作,没有,程序,第1张


                一、运算符重载

                定义

                C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。

                函数名字为:关键字operator后面接需要重载的运算符符号。

                函数原型:返回值类型 operator操作符(参数列表)

                注意:

                • 不能通过连接其他符号来创建新的操作符:比如operator@

                • 重载操作符必须有一个类类型参数 用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义

                • 作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this

                • .* :: sizeof ?: . 注意以上5个运算符不能重载。

                  实例

                  // 全局的operator==
                  class Date
                  {
                  public:
                      Date(int year = 1900, int month = 1, int day = 1)
                      {
                          _year = year;
                          _month = month;
                          _day = day;
                      }
                      //private:
                      int _year;
                      int _month;
                      int _day;
                  };
                  // 这里会发现运算符重载成全局的就需要成员变量是公有的,那么问题来了,封装性如何保证?
                  // 这里其实可以用友元解决,或者干脆重载成成员函数。
                  bool operator==(const Date& d1, const Date& d2)
                  {
                      return d1._year == d2._year
                          && d1._month == d2._month
                          && d1._day == d2._day;
                  }
                  void Test()
                  {
                      Date d1(2018, 9, 26);
                      Date d2(2018, 9, 27);
                      cout 
                  public:
                      Date(int year = 1900, int month = 1, int day = 1)
                      {
                          _year = year;
                          _month = month;
                          _day = day;
                      }
                      // bool operator==(Date* this, const Date& d2)
                      // 这里需要注意的是,左操作数是this,指向调用函数的对象
                      bool operator==(const Date& d2)
                      {
                          return _year == d2._year;
                          && _month == d2._month
                              && _day == d2._day;
                      }
                  private:
                      int _year;
                      int _month;
                      int _day;
                  };
                  
                      return d1._year == d2._year
                          && d1._month == d2._month
                          && d1._day == d2._day;
                  }
                  class Date
                  {
                  public:
                      Date(int year = 1900, int month = 1, int day = 1)
                      {
                          _year = year;
                          _month = month;
                          _day = day;
                      }
                      // bool operator==(Date* this, const Date& d2)
                      // 这里需要注意的是,左操作数是this,指向调用函数的对象
                      bool operator==(const Date& d2)
                      {
                          return _year == d2._year;
                          && _month == d2._month
                              && _day == d2._day;
                      }
                  private:
                      int _year;
                      int _month;
                      int _day;
                  };
                  
                  public:
                      Date(int year = 1900, int month = 1, int day = 1)
                      {
                          _year = year;
                          _month = month;
                          _day = day;
                      }
                      Date(const Date& d)
                      {
                          _year = d._year;
                          _month = d._month;
                          _day = d._day;
                      }
                      Date& operator=(const Date& d)
                      {
                          if (this != &d)
                          {
                              _year = d._year;
                              _month = d._month;
                              _day = d._day;
                          }
                          return *this;
                      }
                  private:
                      int _year;
                      int _month;
                      int _day;
                  };
                  
                  public:
                      Date(int year = 1900, int month = 1, int day = 1)
                      {
                          _year = year;
                          _month = month;
                          _day = day;
                      }
                      int _year;
                      int _month;
                      int _day;
                  };
                  // 赋值运算符重载成全局函数,注意重载成全局函数时没有this指针了,需要给两个参数
                  Date& operator=(Date& left, const Date& right)
                  {
                      if (&left != &right)
                      {
                          left._year = right._year;
                          left._month = right._month;
                          left._day = right._day;
                      }
                      return left;
                  }
                  // 编译失败:
                  // error C2801: “operator =”必须是非静态成员
                  
                  public:
                      Time()
                      {
                          _hour = 1;
                          _minute = 1;
                          _second = 1;
                      }
                      Time& operator=(const Time& t)
                      {
                          if (this != &t)
                          {
                              _hour = t._hour;
                              _minute = t._minute;
                              _second = t._second;
                          }
                          return *this;
                      }
                  private:
                      int _hour;
                      int _minute;
                      int _second;
                  };
                  class Date
                  {
                  private:
                      // 基本类型(内置类型)
                      int _year = 1970;
                      int _month = 1;
                      int _day = 1;
                      // 自定义类型
                      Time _t;
                  };
                  int main()
                  {
                      Date d1;
                      Date d2;
                      d1 = d2;
                      return 0;
                  }
                  
                  public:
                      Stack(size_t capacity = 10)
                      {
                          _array = (DataType*)malloc(capacity * sizeof(DataType));
                          if (nullptr == _array)
                          {
                              perror("malloc申请空间失败");
                              return;
                          }
                          _size = 0;
                          _capacity = capacity;
                      }
                      void Push(const DataType& data)
                      {
                          // CheckCapacity();
                          _array[_size] = data;
                          _size++;
                      }
                      ~Stack()
                      {
                          if (_array)
                          {
                              free(_array);
                              _array = nullptr;
                              _capacity = 0;
                              _size = 0;
                          }
                      }
                  private:
                      DataType* _array;
                      size_t _size;
                      size_t _capacity;
                  };
                  int main()
                  {
                      Stack s1;
                      s1.Push(1);
                      s1.Push(2);
                      s1.Push(3);
                      s1.Push(4);
                      Stack s2;
                      s2 = s1;
                      return 0;
                  }
                  
                          if (this != &d)
                          {
                              _year = d._year;
                              _month = d._month;
                              _day = d._day;
                          }
                          return *this;
                      }
                  
                  public:
                      Date(int year = 1900, int month = 1, int day = 1)
                      {
                          _year = year;
                          _month = month;
                          _day = day;
                      }
                      // 前置++:返回+1之后的结果
                      // 注意:this指向的对象函数结束后不会销毁,故以引用方式返回提高效率
                      Date& operator++()
                      {
                          _day += 1;
                          return *this;
                      }
                      // 后置++:
                      // 前置++和后置++都是一元运算符,为了让前置++与后置++形成能正确重载
                      // C++规定:后置++重载时多增加一个int类型的参数,但调用函数时该参数不用传递,编译器自动传递
                          // 注意:后置++是先使用后+1,因此需要返回+1之前的旧值,故需在实现时需要先将this保存一份,然后给this + 1
                          //而temp是临时对象,因此只能以值的方式返回,不能返回引用
                          Date operator++(int)
                      {
                          Date temp(*this);
                          _day += 1;
                          return temp;
                      }
                  private:
                      int _year;
                      int _month;
                      int _day;
                  };
                  int main()
                  {
                      Date d;
                      Date d1(2022, 1, 13);
                      d = d1++;    // d: 2022,1,13   d1:2022,1,14
                      d = ++d1;    // d: 2022,1,15   d1:2022,1,15
                      return 0;
                  }
                  
                  public:
                      MyClass& operator++() {          // 前置++
                          // 在此处增加1的逻辑
                          return *this;
                      }
                      
                      MyClass operator++(int) {       // 后置++
                          MyClass temp(*this);        // 复制当前对象
                          // 在此处增加1的逻辑
                          return temp;                // 返回增加前的对象
                      }
                  };
                  
                  public:
                      int value;
                      
                      MyClass(int val) : value(val) {}
                      
                      friend std::ostream& operator
                          os 
                      MyClass obj(42);
                      
                      std::cout 
                  public:
                      Date(int year = 1900, int month = 1, int day = 1)
                      {
                          _year = year;
                          _month = month;
                          _day = day;
                      }
                     	void operator
                  		out
                      Date d1;
                      d1.operator
                  	out

文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复:表情:
评论列表 (暂无评论,0人围观)

还没有评论,来说两句吧...

目录[+]

取消
微信二维码
微信二维码
支付宝二维码