类和对象(4):运算符重载 1

简介: 类和对象(4):运算符重载 1

一、运算符重载

1.1 运算符重载

运算符重载是具有特殊函数名的函数,函数名字为:关键词operator+需要重载的运算符符号

  1. 不能重载C/C++中未出现的符号,如:operator@
  2. 重载操作符必须有一个类类型参数。
  3. 不能改变用于内置类型运算的运算符其具有的含义。
// 以下代码只是为了举例,本质是错误的
int operator+(int a, int b)
{
    return a - b;// error
}
  1. 作为类成员函数重载时,第一个参数为隐藏的this
  2. .*::sizeof、三目运算符?:.,以上5个预算符不能被重载。
1.2 Date类举例

重点为运算符重载中关键的细节。

// Date.h
class Date
{
public:
  Date(int year = 1, int month = 1, int day = 1)
  {
    assert(month >= 1 && month <= 12);// 避免创建不合法日期
    _year = year;
    _month = month;
    _day = day;
  }
  void Print()
    {
        cout << _year << " " << _month << " " << _day << endl;
  }
    int GetMonthDay(int year, int month)// 获取当年当月有多少天
  {
        assert(month >= 1 && month <= 12);
        int Day[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
        if (month == 2 && (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)))
        {
            return 29;
        }
    return Day[month];
  }
  Date& operator=(const Date& d);// Date类可以不写赋值重载
  Date& operator+=(int x);
  Date operator+(int x);
private:
  int _year;
  int _month;
  int _day;
};
// Date.cpp
// 赋值运算符重载
Date& Date::operator=(const Date& d)
{
    _year = d._year;
    _month = d._month;
    _day = d._day;
    return *this;
}
Date& Date::operator+=(int x)// operator+=(Date* this, int x)
{
  _day += x;
  while (_day > GetMonthDay(_year, _month))
  {
    _day -= GetMonthDay(_year, _month);
    _month++;
    if (_month == 13)
    {
      _year++;
      _month = 1;
    }
  }
  return *this;
}
Date Date::operator+(int x)
{
  Date tmp(*this);
  tmp += x;
  return tmp;
}
  1. 拷贝构造和赋值重载的区别:
int main()
{
    Date d1(2023, 10, 3);
    Date d2(d1);// 一个已经存在的对象去拷贝初始化另一个对象
    Date d3;
    d1 = d2 = d3;// 两个已经存在的对象拷贝
}
  1. 赋值重载和+=重载的返回值类型为Date&*this在函数调用结束后并没有被销毁,传引用返回可以避免创建临时对象。
  2. 调用+重载时,对象本身不被改变,因此需要拷贝一个临时对象完成运算。

相关文章
|
存储 编译器 C++
C++类与对象 - 3(拷贝构造函数和运算符重载)(超详细)(上)
C++类与对象 - 3(拷贝构造函数和运算符重载)(超详细)
42 0
|
6月前
|
存储 安全 编译器
【c++】类和对象(四)深入了解拷贝构造函数
朋友们大家好啊,本篇内容带大家深入了解拷贝构造函数
【c++】类和对象(四)深入了解拷贝构造函数
|
6月前
|
C++
c++类和对象(+十运算符重载一贱值运算符重载讲解
c++类和对象(+十运算符重载一贱值运算符重载讲解
28 1
|
6月前
|
C++ 开发者
【C++】类和对象之运算符重载(三)
【C++】类和对象之运算符重载(三)
|
编译器 C++
【C++基础(六)】类和对象(中) --拷贝构造,运算符重载(下)
【C++基础(六)】类和对象(中) --拷贝构造,运算符重载(下)
|
6月前
|
C++
C++——类和对象之拷贝构造
C++——类和对象之拷贝构造
|
6月前
|
编译器 C++
C++类与对象【运算符重载】
C++类与对象【运算符重载】
|
6月前
|
存储 编译器 C语言
C++初阶类与对象(三):详解复制构造函数和运算符重载
C++初阶类与对象(三):详解复制构造函数和运算符重载
48 0
|
6月前
|
存储 安全 编译器
【C++入门到精通】C++入门 —— 类和对象(拷贝构造函数、赋值运算符重载、const成员函数)
这一篇文章是上一篇的续集(这里有上篇链接)前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的命名空间的一些知识点以及关于C++的缺省参数、函数重载,引用 和 内联函数。也相信大家都掌握的不错,接下来博主将会带领大家继续学习有关C++比较重要的知识点——类和对象(拷贝构造函数、赋值运算符重载、const成员、取地址及const取地址操作符重载)。
81 0
|
11月前
|
编译器 C++
类和对象:运算符重载
类和对象:运算符重载