首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么这个c++类中的重载operator+不需要实现为operator-?

在C++中,重载运算符的目的是为了使类对象能够像内置类型一样进行运算操作。对于重载的运算符,我们可以根据需要自定义其行为。在这个问题中,为什么重载的operator+不需要实现为operator-,可以从以下几个方面进行解释:

  1. 运算符的语义不同:operator+和operator-代表了不同的运算语义。operator+通常表示两个对象的加法操作,而operator-表示两个对象的减法操作。这两个运算符的行为和结果是不同的,因此它们需要分别实现。
  2. 运算符的操作数不同:operator+和operator-的操作数是不同的。operator+通常用于两个相同类型的对象之间进行运算,而operator-通常用于两个相同类型的对象之间进行运算。由于操作数的不同,它们的实现也是不同的。
  3. 运算符的返回类型不同:operator+和operator-的返回类型通常也是不同的。operator+通常返回一个新的对象,该对象是两个操作数相加的结果,而operator-通常返回一个新的对象,该对象是两个操作数相减的结果。由于返回类型的不同,它们的实现也是不同的。

总结起来,重载operator+和operator-的目的是为了实现不同的运算语义,操作数和返回类型的不同导致了它们需要分别实现。因此,在C++中,我们需要根据具体的需求来决定是否需要实现operator-,而不是简单地将operator+的实现复制为operator-的实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++ 运算符重载基本概念

— 1 — 运算符重载需求 C++ 预定义运算符,只能用于基本数据类型运算:整型、实型、字符型、逻辑型等等,且不能用于对象运算。...比如,在数学上,两个复数可以直接进行+、-等运算,但在C++,直接将+或-用于复数对象是不允许。有时会希望,让对象也能通过运算符进行运算。这样代码就更简洁,也容易理解。...运算符重载基本形式如下: 返回值类型 operator 运算符(形参表) { ... } 下面举个例子,实现对复数对象+和-运算符重载: class Complex // 复数 { public...如:c = a + b; 等价于c = operator+(a,b) 在上面的代码,我把重载+号运算符普通函数,在Complex复数定义成了友元函数,目的是为了友元函数能访问对象私有成员,否则会编译报错...为什么重载-号和+号运算符函数参数表是const Complex & c常引用类型而不是Complex c呢?

1K40

C++运算符重载详解(日期操)

前言:为什么要实现运算符重载?...此时括号意义就是控制优先级 日期运算符操 头文件(函数声明) class Date { public: // 获取某年某月天数 int GetMonthDay(int year, int..._year++; } } return tmp; } 重载过程注意点: 构造函数如果声明和定义分离,声明需要将参数赋缺省值,定义不需要写,以防混淆。...传参数时尽量都要用引用传参,可以提高传参效率 传返回值时,如果返回值在调用完这个函数没有被销毁,需要引用返回,如果销毁了,直接返回。 多复用已经实现函数! 关于返回值到底是引用还是不需要引用?...不然可读性很差,像下面定义在内部: 重载流操作符为什么必须用引用?

5210
  • C++笔记:运算符重载

    C++笔记:运算符重载 引言 函数重载就是对一个已有的函数赋予新含义,使之实现新功能,做到“一名多用”。 运算符也可以重载,在C++标准库也使用了大量运算符重载。...) 运算符重载和方法 成员函数作为运算符重载函数 友元函数作为运算符重载函数 class Complex //复数 { public: //使用成员函数重载运算符+ Complex...将双目运算符重载为友元函数时,形参表列必须有两个参数,形参顺序任意。...重载运算符规则 C++ 不允许用户自己定义新运算符,只能对已有的 C++ 运算符进行重载C++ 绝大部分运算符允许重载。...重载双目运算符 例: 声明一个复数Complex,有部和虚部组成,重载运算符“+” “-” “+=”,“-=” ,实现复数相应运算。

    1.3K20

    C++(运算符重载+赋值拷贝函数+日期书写)

    运算符重载 C++为了增强代码可读性引入了运算符重载,运算符重载是具有特殊函数名函数,也具有其 返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通函数类似。...既然编译器生成默认赋值运算符重载函数已经可以完成字节序值拷贝了,还需要自己 现吗?当然像日期这样是没必要。那么下面的呢?验证一下试试? // 这里会发现下面的程序会崩溃掉?...,是不需要,一旦有动态申请资源存在时,就必须写一个赋值拷贝函数 下图是对上面代码解释 运算赋值重载+=和+ 由于日期设计到平年和闰年每一个月日期不同,所以我们可以将1到12月每个月天数存在一个数组...,然后获取每个月天数,这里我们可以只存放平年,然后闰年天数只有二月是不相同,所以二月我们单独拿出来讨论 注意:这个函数我们可以写在完成函数默认都是内联函数,因为我们后面会经常调用这个函数..._day; return in; } 这里加入了返回值之后,就可以进行连续流插入和流提取了 总结 在本文中,我们深入探讨了运算符重载和赋值拷贝函数在C++应用。

    6210

    C++和对象之赋值运算符重载

    前言 在前面的博客中提到了拷贝构造: 【C++和对象之拷贝构造函数篇,和 运算符重载C++和对象之常引用与运算符重载,接下来继续来看赋值运算符重载赋值运算符重载。 2....原因:赋值运算符如果不显式实现,编译器会生成一个默认。此时用户再在外自己实现一个全局赋值运算符重载,就和编译器在中生成默认赋值运算符重载冲突了,故赋值运算符重载只能是成员函数。...用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值方式逐字节拷贝。注意:内置类型成员变量是直接赋值,而自定义类型成员变量需要调用对应赋值运算符重载完成赋值。...对内置类型值拷贝,自定义类型调用对应拷贝构造和赋值重载。 既然编译器生成默认赋值运算符重载函数已经可以完成字节序值拷贝了,还需要自己 现吗?当然像日期这样是没必要。那么下面的呢?...C++规定:后置++重载时多增加一个int类型参数,但调用函数时该参数不用传递,编译器自动传递 注意:后置++是先使用后+1,因此需要返回+1之前旧值,故需在实现时需要先将this保存一份,然后给

    12510

    与对象 (剩余部分) 以及 日历

    运算符重载 • 当运算符被⽤于类型对象时,C++语⾔允许我们通过运算符重载形式指定新含义。...C++规定类型对象使⽤运算符时,必须转换成调⽤对应运算符重载,若没有对应运算符重载,则会编译报错。 • 运算符重载是具有特名字函数,他名字是由operator和后⾯要定义运算符共同构成。...(选择题⾥⾯常考,⼤家要记⼀下) • 重载操作符⾄少有⼀个类型参数,不能通过运算符重载改变内置类型对象含义,如: int operator+(int x, int y) • ⼀个需要重载哪些运算符...,是看哪些运算符重载后有意义,⽐如Date重载operator-就有意 义,但是重载operator+就没有意义。...• const实际修饰该成员函数隐含this指针,表明在该成员函数不能对任何成员进⾏修改。

    6310

    C++】实现日期相关接口

    命名空间 缺省参数与函数重载 C++相关知识 和对象上 和对象 和对象下 引言 本篇将介绍实现日期众多接口,同时这其中涉及到很多知识,务必将上篇内容掌握再来实现日期相关接口...如果你想让这个函数是内敛,可以在里面定义函数,默认是内敛,内敛不支持声明和定义分离。...由于表示年月日成员对象都在日期中封装起来,外部不能随便访问成员,只能在实现**GetMonthDay**函数,在通过return将获得天数返回。...,隐含this指针占用第一个参数位置,Date必须是左操作数,d1<<cout是不符合我们习惯 对此我们可以在外实现该运算符重载函数,就可以自己设计参数部分位置 但是又引出了另一个问题:外不能访问私有成员...,如果将私有权限放开,就缺乏安全性,对此C++中有友元,接下来我们会涉及到,这里就使用下,虽然这个全局函数不在,但是可以访问私有成员函数 //友元,告诉该类这两个全局函数是我们朋友,允许使用私有成员

    7610

    C++】操作符重载应用—— 重现

    (虽然流提取不会出现这种情况,为了统一,一并写在外) 2.流插入写在外访问内成员方法——友元 但是成员是private(私有的),我们可以通过友元(声明操作符重载函数能进入内访问权限...<=等】 1.代码展示: 内声明: PS:加const,可以让普通变量和const变量都能调用该函数(具体知识点可见YYC++知识合集博客,关于const解读) bool operator...YYC++知识合集博客,关于const解读) PS:const加在后面表示const Date* this ;表明在该成员函数不能对任何成员进行修改,而+=,-=是要实现对内成员改变,因此不能加...; Date& operator+=(int day); Date operator+(int day) const; Date& operator-=(int day); Date operator...增加参数int,构成函数重载 2.代码展示: 内声明: //增加这个int参数不是为了接收具体值,仅仅是占位,跟前置++构成重载 Date& operator++(); Date operator

    10110

    C++与对象项目实践 — 日期管理工具

    项目背景 在现代软件开发,日期作为一个常见基础需求,广泛用于各类系统日程管理,数据分析,交易记录等场景。但是C++时间日期功能比较有限,无法满足复杂开发需求。...为此我们需要开发一款简单高效“日期C++项目。 项目需求 日期结构设计:我们需要实现一个名为“Date”C++自定义类型,包含年(_year),月(_month),日(_day)。...日期有效性检查:Date需要实现对日期有效性严格检查,确保月份正常,保证闰年判断,符合各个月份实际天数。...析构函数: 简单地将日期成员变量设为0,但在实际应用这通常不是必要,因为生命周期结束后,系统会自动释放其占用内存资源。..._day; } 2.3 析构函数 析构函数简单一写即可,因为我们没有开辟空间,不需要考虑复杂问题。

    14110

    运算符重载基本规则和习惯用法是什

    运算符重载通用语法 在重载时,你不能更改 C++ 内置类型运算符含义,只能对自定义类型[1]运算符进行重载。也就是,运算符两边操作数至少有一个是自定义类型。...运算符重载三个基本规则 C++ 重载有三个基本规则, 如果一个运算符含义不是很清楚时候,它就不应该被重载。 如果非要这样的话,倒不如直接提供一个函数来实现你想要功能。...., Nov, Dec} 你想为它重载递加和递减运算符,但是你是无法实现它们为成员函数,因为在 C++ ,枚举类型压根就没有成员函数这一说。...还有,对于嵌套在模板模板,operator<() 作为内联成员函数会更方便去读写成员变量,但这种情况不是经常能遇到。 普通运算符重载用法 重载运算符大部分代码都是固定。...这个时候显示转换就显得很有必要。

    74010

    C++和对象()【下篇】

    赋值运算符重载 运算符重载 当运算符被⽤于类型对象时,C++语⾔允许我们通过运算符重载形式指定新含义。...C++规定类型对象使⽤运算符时,必须转换成调⽤对应运算符重载,若没有对应运算符重载,则会编译报错。 运算符重载是具有特殊名字函数,他名字是由operator和后⾯要定义运算符共同构成。...如果⼀个重载运算符函数是成员函数,则它第⼀个运算对象默认传给隐式this指针,因此运算符重载作为成员函数时,参数⽐运算对象少⼀个。 有隐式this指针,所以我们不需要显示写d1这个参数。...像Date这样成员变量全是内置类型且没有指向什么资源,编译器⾃动⽣成赋值运算符重载就可以完成需要拷⻉,所以不需要我们显⽰实现赋值运算符重载。...const实际修饰该成员函数隐含this指针指向内容,表明在该成员函数不能对任何成员进⾏修改。

    9410

    (转载非原创)C++运算符重载介绍

    C ++ 预定义运算符操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如),也需要类似的运算操作。...: " 以外,C ++ 所有运算符都可以重载。 ( 2 ) 重载运算符限制在C ++ 语言中已有的运算符范围内允许重载运算符之中,不能创建新运算符。...比如说你重载+号,如果写在外面,那么是需要两个参数,而写在里面,只能写一个参数,因为当这个函数被调用时候,会自动传一个this指针进去,就是对象本身,所以只需要一个参数 ( 2 ) 前置单目运算符重载成员函数时...比如前置++,和后置++,带一个整形形参只是为了区分 1|21.2 友元运算符 有些运算符是一定得声明为友元,比如>运算符 因为=,+这些运算符,是c++最基本运算符,而>>,<<运算符是标准头文件里面的一个里面写.../wanghongyang"; //重载,运算符重载函数作为友元函数 Vec2D operator+(const Vec2D& v1, const Vec2D& v2) { Vec2D ret

    84300

    C++和对象练习——日期实现

    前言 在上一篇文章我们学习和对象过程,我们不是写了一个日期嘛。 但是我们之前实现日期并不是很完整,我们只是借助它来帮大家学习和对象知识。...另外呢,我们最终实现是一个完整日期,那方便对代码进行维护和管理,以及对实现好日期进行测试,我们还是像之前写数据结构一样,放在多个文件。 1....C++规定:后置++重载时多增加一个int类型参数,但调用函数时该参数不用传递(它作用就是为了构成重载),编译器自动传递。 所以呢,这样搞就行了。...不过我们今天写这个日期,里面我是所有成员函数声明和定义都分离了,大家以后可以根据实际情况,有些成员函数直接定义在里面。...另外还有一点: 上一篇文章我们不是还学习了const成员函数嘛,大家还可以看一看我们日期这么多成员函数,哪一个在函数内部不需要改变调用它对象,是不是把它实现成const成员函数也是比较好

    31610

    C++修行之道】和对象(五)日期实现、const成员、取地址及const和取地址操作符重载

    else { return monthDayArray[month]; } } 问:这个函数为什么不和其他函数一样放在Date.cpp文件实现呢?...效率:由于不需要创建新对象,复合运算符在性能上可能更高效,特别是在需要频繁更新日期场景。...operator(1) // 为了区分,构成了重载,给后置++,强行增加了一个int形参 // 这里不需要写形参名,因为接收值是多少不重要,也不需要调用 // 这个参数仅仅是为了前缀和后缀区分而存在...语义上:前置运算符语义是先对对象进行递作,然后返回操作后对象。这里关键是“操作后对象”。 效率:返回引用避免了不必要创建和返回对象拷贝。在C++,对象复制可能是一个昂贵操作。...前置++和后置++都是一元运算符,为了让前置++与后置++形成能正确重载 C++规定:后置++重载时多增加一个int类型参数,但调用函数时该参数不用传递,编译器自动传递。

    9710

    C++修炼之路】4. 和对象():日期实现

    C++之类和对象()后续 本节目标 1....(分离后,函数定义采用::限定符来确定是属于这个函数),并且我们将这些运算能进行一定复用从而减少代码量 框架搭建好之后,就需要利用我们上个文章运算符重载内容将日期加、减、等操作进行一系列实现...因此,C++规定:将括号带有int规定为后置++,不带int为前置++ 。...当我们单拿出来之后,会发现,这样访问变量是私有变量,由于这个函数不在,我们通过这个函数不能访问私有变量,因此也就是需要把private限定解开,变成public,虽然这样可以,但却失去了对于内部成员保护...会变成:d.operator>(*this),而d在这个函数是const限定不可修改,传入>运算符重载之后,就会使得权限放大,因此,我们也需要对这些比较运算符this指向没人进行const

    81200

    C++奇迹之旅:从0开始实现日期时间计算器

    _day; } return *this; } 此时此刻,头文件大致完成了,我们接下来要来实现简单大小比较操作: 如这些通用运算符重载,你可以吧他们加到头文件Date.cDate里public...*this; } 两种方法都是要创建新变量,效果一样,第一种创建变量,拷贝构造,然后复用+=,返回要创建临时对象,这种方式优点是,在调用 operator+ 时,不需要重复计算日期更新逻辑,因为...operator+= 已经实现了这个逻辑。...调用 operator-= 函数将当前日期对象减 1 天,返回保存临时日期对象。 前置递减运算符通常更高效,因为它不需要创建临时对象。...自定义流输入和输出 通常我们可以输入时候是不是想这样输入:cin>>d1或者输出cout<<d2,如下面这个流运算符重载,我们知道重载这里有this指针,顺序是this ,cout,那么它传参表示是

    12910

    移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——2.和对象((2))

    • 运算符重载以后,其优先级和结合性与对应内置类型运算符保持⼀致。 • 不能通过连接语法没有的符号来创建新操作符:⽐如operator@。 .*  ::  sizeof  ?:  ....(选择题⾥⾯常考,⼤家要记⼀ 下) • 重载操作符⾄少有⼀个类型参数,不能通过运算符重载改变内置类型对象含义,如: int operator+(int x, int y) • ⼀个需要重载哪些运算符...,是看哪些运算符重载后有意义,⽐如Date重载operator-就有意 义,但是重载operator+就没有意义。...• 重载++运算符时,有前置++和后置++,运算符重载函数名都是operator++,⽆法很好区分。 C++规定, 后置++重载时,增加⼀个int形参,跟前置++构成函数重载,⽅便区分。...• const实际修饰该成员函数隐含this指针,表明在该成员函数不能对任何成员进⾏修改。

    9910

    C++和对象 练习小项目---日期实现.

    个人主页: :✨✨✨初阶牛✨✨✨ 推荐专栏1: C语言初阶 推荐专栏2: C语言进阶 个人信条: 知行合一 本篇简介:>:为了更好理解C++和对象知识,我们可以动手实现一下C++一个简单日期...✨ 前言 这是我们需要实现日期接口声明,我们需要是在Date.cpp文件实现函数定义. class Date { public: // 获取某年某月天数 int GetMonthDay...int _day; }; 一、构造函数 1.1 默认构造函数 声明:(在Date) //Date.h // 全缺省构造函数 Date(int year = 2023, int month =...这个参数用户在使用时不需要传递,编译器会自动传递,本质是为了让前置++和后置++进行函数重载....++构成函数重载,调用时候不需要传参. { Date tmp = *this;//要保存++前日期大小.

    27420

    C++实战——日期实现

    接下来,根据减少月份重新计算_day值。首先获取减少后月份天数,然后将_day加上这个天数。 最后,返回当前对象引用。 通过重载"-="运算符,可以实现给Date对象减少指定天数操作。...关于重载比较运算符为什么要加外部const 在C++,比较运算符重载通常需要将其定义为成员函数。在重载比较运算符时,我们需要考虑到两个方面: 在比较运算符重载,我们不希望修改成员变量。...示例 const Date d1(2024,4,11); d1< d2 会报错,是因为this指针在里是Date* const this修饰C++成员函数有一个隐含指向当前对象指针...如果允许将常量对象传递给非常量指针,就会破坏常量对象只读属性。为了确保对象常量性,C++编译器会报错。 所以,this指针接受一个常量会报错。...+=(int day); Date& operator-=(int day); Date operator+(int day); Date operator-(int day); bool operator

    10510

    C++和对象()】—— 我与C++不解之缘(四)

    前言: 接下来进行和对象学习,了解和对象默认成员函数 一、和对象默认成员函数         默认成员函数就是用户没有显示实现,编译器会自动生成成员函数。...二、赋值运算符重载         2.1、运算符重载 1、当运算符被用于类型对象时,C++语言允许我们通过运算符重载形式指定新含义。...(选择题里面常考,要记一 重载操作符至少有一个类型参数,不能通过运算符重载改变内置类型对象含义,如: int operator+(int x,int y) 8、一个需要重载哪些运算符,是看哪些运算符重载后有意义...,比如Date重载operator-就有意义,但是重载operator+就没有意义。...2、 const实际修饰该成员函数this指针,表明在该成员函数不能对任何成员进行修改。

    10710
    领券