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

<<重载运算符,为什么它不能返回到仅类类型(没有引用)

重载运算符是一种特殊的函数,它允许我们为自定义的类类型定义运算符的行为。在C++中,重载运算符可以返回到类类型,但是不能返回到仅类类型(没有引用)。

这是因为返回到仅类类型会导致潜在的问题。当我们返回一个类类型时,实际上是返回了一个临时对象的副本。如果我们返回到仅类类型,那么这个副本将会被复制到一个新的临时对象中,这样就会产生额外的开销和内存消耗。

另外,返回到仅类类型还会引发对象切片问题。对象切片是指当我们将派生类对象赋值给基类对象时,只会复制基类部分的成员,派生类特有的成员将会被丢失。如果我们返回到仅类类型,那么可能会导致对象切片问题,丢失掉一些重要的数据。

因此,为了避免这些问题,C++规定重载运算符不能返回到仅类类型。如果我们需要返回一个类类型,可以使用引用或指针来实现。通过返回引用或指针,我们可以避免额外的复制和对象切片问题。

总结起来,重载运算符不能返回到仅类类型,以避免额外的开销和对象切片问题。

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

相关·内容

C嘎嘎入门篇:和对象番外(时间

前文: 小编在前文讲述了和对象的一部分内容,其中小编讲述过运算符重载这个概念以及一个时间,当时小编讲的没有那么细致,下面小编将会讲述时间来帮助各位读者朋友更好的去理解运算符重载,那么,代码时刻到...,自然也会有拷贝构造函数的书写,其实对于时间这个来说,拷贝构造函数是无须书写的,因为时间的成员变量并没有涉及到资源的调用,都是内置类型,此时我们直接使用系统默认给我们生成的拷贝构造函数就好,内置类型我们需使用浅拷贝即可...赋值运算符重载是小编在上篇文章刚刚讲述的内容,对于赋值运算符来说,其实和拷贝构造函数是类似的,如果一个的成员变量是不需要开辟资源的话,那么完全可以不用去写,内置类型我们需浅拷贝就满足情况了,...(*this >= x); } 1.5.6.小于等于运算符重载 这个小于等于的重载和上面几位仁兄的原理是一样的,此时我们需找到的反,的反是大于,我们需让大于操作符取反即可,下面展示代码:...,此时我们返回值类型不能引用类型了,而是单纯的类型,因为此时我们返回的内容是一块临时对象,此时这个新建立的对象函数栈帧结束以后就销毁了,我们如果使用引用会造成野引用的问题,下面小编就展示+函数的写法

5110

与对象(中(2))

拷贝构造函数是构造函数的一个重载形式。 2. 拷贝构造函数的参数只有一个且必须是类型对象的引用,使用传值方式编译器直接报错, 因为会引发无穷递归调用。...(浅拷贝/值拷贝) 自定义类型必须调用拷贝构造完成拷贝 这就能很好解释为什么不能传值调用(会引发无限递归,编译器一般会直接报错) 3....函数原型:返回值类型 operator操作符(参数列表) 注意: 1.不能通过连接其他符号来创建新的操作符:比如operator@ 2.重载操作符必须有一个类型参数 3.用于内置类型运算符,...赋值运算符只能重载的成员函数不能重载成全局函数 原因:赋值运算符如果不显式实现,编译器会生成一个默认的。...用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。 注 意:内置类型成员变量是直接赋值的,而自定义类型成员变量需要调用对应的赋值运算符重载完成赋值。

8310
  • C嘎嘎入门篇:和对象(2)

    ,此时我们还是不用去写返回类型(这个重点,这篇文章小编隔了半个月重新去写,我重新练习这部分内容的时候,我就忘记了拷贝构造函数是没有返回值的,直到我写了这篇文章才反应过来),函数名就是的名字,括号里面是一个类型对象的引用...,下面小编先给各位展示运算符重载的几个特点: 5.1.1.运算符重载前几个特点 从头开始看,开头就告诉我们想要将运算符用于类型对象的时候,就必须去通过运算符重载的形式去进行定义,我们在进行类型对象的加减的时候...直到不能用就好,在以后我们不断的学习中可能就知道祖师爷为什么不让我们去重载这个了,之后的几个特点读者朋友看着就能理解,小编就不在多叙述了(等小编讲述时间的时候就会对其中几个多做说明),下面我们就先重载一个运算符...:赋值运算符~ 5.2.赋值运算符重载的书写 首先我们在写运算符重载的时候我们需要注意返回类型,由于此时我们是赋值运算符重载,所以返回的类型肯定就是类型,此时我们在返回的时候可以传引用返回,减少临时空间的产生...,增加代码的效率,此时我们是需要把赋值运算符重载作为成员函数的,所以此时我们需写一个形参即可,赋值操作涉及到了两个的操作,所以我们直接传一个类型对象的引用即可,这样可以减少拷贝构造函数的生成,之后的操作其实就和我们之前写的拷贝构造函数一样了

    7610

    CC++面试常问题集(2)

    6、哪些成员函数不能被继承? C++中,并不是所有的成员函数都能被子类继承,有三成员函数不能被子类继承,分别是:构造函数(包括拷贝构造)、析构函数、赋值运算符重载函数。...三,赋值运算符重载函数  赋值运算符重载函数也不会被子类继承,只是在子类的赋值运算符重载函数中会调用父的赋值运算符重载函数。 7、基的析构函数为什么要用virtual虚析构函数?...友元函数  友元函数不属于的成员函数,不能被继承。对于没有继承特性的函数没有虚函数的说法。 9、多态,虚函数,纯虚函数?...子类必须重写抽象中的纯虚函数,否则子类也属于抽象,也无法实例化对象。 image.png 接口 概念:含有纯虚函数的称为接口没有任何数据成员,只有成员函数,而且成员函数都是纯虚函数。...,程序员无法直接对进行存取),被引用对象直接用r表示 (4)可以有const指针,但是没有const引用; (5)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的

    1.2K10

    和对象:运算符重载

    前言: 在C++中,运算符重载是一种强大的特性,允许我们重新定义已有的运算符,以便用于用户自定义的数据类型。...通过运算符重载,我们可以使得我们自定义的对象像内置类型一样进行运算,这为编写清晰、简洁且易于理解的代码提供了便利。 为什么要进行运算符重载?...运算符重载的语法 函数原型:**返回值类型 operator操作符(参数列表)** 注意: 不能通过连接其他符号来创建新的操作符:比如operator@ 重载操作符必须有一个类型参数 用于内置类型运算符...当运行到使用重载运算符的时候就会进行调用重载函数: 赋值运算符重载 赋值运算符重载格式 参数类型:const T&,传递引用可以提高传参效率 返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值...当尝试将赋值运算符重载函数作为静态函数进行定义时: 在C++中,赋值运算符 = 被设计为的成员函数,这是因为需要访问的内部状态,并且需要能够处理自赋值的情况(即对象赋值给自己)。

    10910

    JAVA笔试题_javabean面试题

    重载对返回类型没有特殊的要求。 ​ 方法重载的规则: ​ 1. 方法名一致,参数列表中参数的顺序,类型,个数不同。 ​ 2. 重载与方法的返回值无关,存在于父和子类,同类中。 ​ 3....但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则 可以。 8. 为什么函数不能根据返回类型来区分重载? ​ 该道题来自华为面试题。 ​...接口中不能有静态方法 ​ 6. 一个可以实现多个接口 相同: ​ 1. 不能够实例化 ​ 2. 可以将抽象和接口类型作为引用类型 ​ 3....注意:equals 方法不能用于基本数据类型的变量,如果没有对 equals 方法进行重写,则比较的是引用类型的变 量所指向的对象的地址。 14. break 和 continue 的区别? ​...至于为什么要把 String 设计成不可变 ,是的用途决定的。其实不只 String,很多 Java 标准库中的都是不可变的。

    49730

    《挑战30天C++入门极限》C++运算符重载函数基础及其值返回状态

    下面我们来学习如何重载运算符运算符重载函数的形式是: 返回类型 operator 运算符符号 (参数说明) { //函数体的内部实现 }   运算符重载函数的使用主要分为两种形式,一种是作为的友元函数进行使用...值得注意的是,对于运算符重载来说,我们并不一定要用它一定要做同类型对象的加法或者是其它运算,运算符重载函数本身就是函数,那么在函数体内部我们是可以做任何事情的,但是从不违背常规思维的角度来说,我们没有必要让重载加运算的函数来做与其重载的符号意义上完全不相符的工作...//递增运算符是单目运算符,使用返回引用运算符重载函数道理就在于需要改变自身。...对于递增运算符来说,的意义在于能够改变自身,返回引用的函数是可以作为左值参与运算的,所以作为单目运算符重载的函数采用返回引用的方式编写是最合适的。   ...对于运算符重载函数来说,最后我们还要注意一个问题,当运算符重载函数的形式参数类型全部为内部类型的时候,将不能重载

    51020

    JavaSE面试深度剖析 第二讲

    重载对返回类型没有特殊的要求。 方法重载的规则: 1.方法名一致,参数列表中参数的顺序,类型,个数不同。 2.重载与方法的返回值无关,存在于父和子类,同类中。...但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。 为什么函数不能根据返回类型来区分重载? 该道题来自华为面试题。...例如: float max(int a, int b); int max(int a, int b); 当调用 max(1, 2);时无法确定调用的是哪个,单从这一点上来说,返回值类型不同的重载是不应该允许的...注意:equals 方法不能用于基本数据类型的变量,如果没有对 equals 方法进行重写,则比较的是引用类型的变量所指向的对象的地址。 break 和 continue 的区别?...至于为什么要把 String 设计成不可变,是的用途决定的。其实不只 String,很多 Java 标准库中的都是不可变的。

    51810

    【C++】和对象(中):的默认成员函数,构造函数、析构函数、拷贝构造函数、运算符重载

    这里解释一下为什么拷贝构造第一个参数传参方式必须是引用。 首先我们要知道,C++规定传值传参要调用拷贝构造,没有为什么,就是规定。比如说下面这个f1函数。...5.运算符重载 运算符被用于类型时,C++允许我们通过运算符重载的形式指定新的含义。 1.运算符重载其实是一个具有特殊名字的函数,的名字由operator和后面要定义的运算符共同组成。...运算符重载我们建议还是写成成员函数。 3.运算符重载以后,优先级和结合性与对应的内置类型运算符保持一致。 4.不能用语法中没有的符号来创建新的操作符。....*) 6.重载操作符至少有一个类型参数,不能通过运算符重载改变内置类型对象的含义。 7.要重载有意义的运算符。比如两个日期加就没有意义,两个日期减就有意义,两个日期减就是相差的天数。...赋值运算符重载的特点: 1.赋值运算符重载是一个运算符重载,规定必须重载为成员函数。赋值运算符重载的参数建议写成 const 当前类型引用 ,可以减少传值传参的拷贝。

    8810

    C++的六大“天选之子“拷贝构造与与运算符重载

    operator+ 需要重载运算符 注意事项: 不能通过连接其他符号来创建新的操作符: 示例:operator@ 重载操作符必须有一个类型参数 运算符重载是通过的成员函数或全局函数来实现的...对于成员函数的重载操作符,至少需要一个类型参数,表示操作符的左操作数。...它不能重载,因为的含义在语言中已经固定不可更改。 .*(指针到成员操作符)和 ->*(指向成员指针的操作符):这些操作符用于访问的成员指针。...它不能重载,因为的语法和含义已经在语言中定义好了。 .在C++中,点操作符(“.”)是用来访问对象的成员的,而它本身是不能重载的。点操作符的行为在语言中是固定的,无法通过重载来改变。...注意:内置类型成员变量是直接赋值的,而自定义类型成员变量需要调用对应的赋值运算符重载完成赋值。

    16410

    2019Java面试宝典 -- JavaSE基础篇

    方法重写(子类继承父并重写父中已有的或抽象的方法);2. 对象造型(用父类型引用引用类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。...goto 是 Java 中的保留字,在目前版本的 Java 中没有使用。 2、& 和 && 的区别? &运算符有两种用法:(1)按位与,(2)逻辑与。 &&运算符是短路与运算。...重载对返回类型没有特殊的要求。 方法重载的规则: 1.方法名一致,参数列表中参数的顺序,类型,个数不同。 2.重载与方法的返回值无关,存在于父和子类,同类中。...但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。 6、为什么函数不能根据返回类型来区分重载? 该道题来自华为面试题。...例如: 1.float max(int a, int b); 2.int max(int a, int b); 当调用 max(1, 2);时无法确定调用的是哪个,单从这一点上来说,返回值类型不同的重载是不应该允许的

    2.1K20

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

    C++规定类型对象使⽤运算符时,必须转换成调⽤对应运算符重载,若没有对应的运算符重载,则会编译报错。 运算符重载是具有特殊名字的函数,他的名字是由operator和后⾯要定义的运算符共同构成。...(选择题⾥⾯常考,⼤家要记下) 重载操作符⾄少有⼀个类型参数,不能通过运算符重载改变内置类型对象的含义,如: int operator+(int x, int y) ⼀个需要重载哪些运算符,...重载操作符⾄少有⼀个类型参数,不能通过运算符重载改变内置类型对象的含义,如: int operator+(int x, int y) 重载运算符函数的参数个数和该运算符作⽤的运算对象数量⼀样多...像Date这样的成员变量全是内置类型没有指向什么资源,编译器⾃动⽣成的赋值运算符重载就可以完成需要的拷⻉,所以不需要我们显⽰实现赋值运算符重载。...我们可以看到d1+100的日期拷贝给d2,d2变了,为什么d1没有变呢? 运算符重载+,把d1拷贝给add,add+=100,实际上d1并没有改变。

    9310

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

    前言:为什么要实现运算符重载?...运算符重载的概念: 运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值 型与参数列表与普通的函数类似。...注意: 不能通过连接其他符号来创建新的操作符:比如operator@  重载操作符必须有一个类型参数 用于内置类型运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义 作为成员函数重载时,...this指向的对象函数结束后不会销毁,故以引用方式返回提高效率 输入流输出流操作符重载 为什么cin cout能够自动识别任意类型的数据呢?...不然可读性很差,像下面定义在的内部: 重载流操作符为什么必须用引用

    5110

    C++奇迹之旅:深入理解赋值运算符重载

    文章目录 赋值运算符重载 运算符重载 特性 赋值运算符重载 传值返回: 传引用赋值: 两种返回选择 赋值运算符只能重载的成员函数不能重载成全局函数 总结 赋值运算符重载 运算符重载 运算符重载是...,返回值是根据运算符来决定,加减返回int类型,判断大小,使用bool类型:一个重载哪些运算符是看需求,看重载没有价值和意义 特性 不能通过连接其他符号来创建新的操作符:比如operator@ 重载操作符必须有一个类型参数...用于内置类型运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义 作为成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐 藏的this .* :: sizeof...void(OB::*)() 这是一个函数指针类型,指向一个返回值为 void 且没有参数的成员函数。 OB::* 表示这个函数指针是指向 OB 的成员函数。...用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。注意:内置类型成员变量是直接赋值的,而自定义类型成员变量需要调用对应的赋值运算符重载完成赋值。

    12610

    【C++】和对象(第二篇)

    的6个默认成员函数 通过上一篇文章的学习,我们知道如果一个没有成员变量,也没有成员函数,啥也没有,那我们把叫做空。 即如果一个中什么成员都没有,简称为空。...析构函数不能重载 注意析构函数不能重载,因为连参数都没有,何谈重载。 那了解到这里,我们就可以尝试写一个析构函数来练练手了: 就给我们刚才那个栈写一个析构函数吧。...注意 下面我们一起来看一下,在运算符重载这一块,需要注意的一些内容: 不能连接其他符号来创建新的操作符:比如operator@ 重载操作符至少有一个类型的参数 用于内置类型运算符,其含义不能重载改变...,那我们来简单总结一下赋值运算符重载: 参数类型:const 对象的引用,传递引用可以提高传参效率 返回值类型类型&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值 最好检测一下是否是自己给自己赋值...赋值运算符只能重载的成员函数不能重载成全局函数 我们上面重载的一些什么等于、大于、小于、大于等于之类的运算符是不是可以重载外也可以重载里面啊。

    11010

    【C++篇】深度解析与对象(中)

    2.2 构造函数的特点 1.函数名与名相同:构造函数的名字必须和名一致。 2.没有返回值:构造函数不需要返回类型,也不能有返回值。...的名字是在名前加上波浪号~,没有参数且没有返回值。析构函数的主要任务是释放对象在生命周期中占用的资源,例如动态分配的内存、打开的文件句柄等。...4.2 拷贝构造函数的特点 1.构造函数重载:拷贝构造函数是构造函数的一种重载。 2.参数要求:第一个参数必须是类型对象的引用不能用传值方式,否则会引发无限递归。...例如,可以为自定义重载+、-、=等运算符,使这些对象能与内置类型有类似的操作体验。运算符重载的目的是提高代码的可读性和简洁性,让代码更自然地表达程序的意图。...这在包含内置类型成员时没问题,但如果类中有指针成员,浅拷贝会导致两个对象共享同一块内存资源,可能会引发内存管理问题,例如重复释放同一块内存。

    10910

    【C++】流插入、提取运算符类型转换

    流插入,流提取运算符重载类型转换的讲解和实例 重载流插入和提取运算符运算符函数,不能作为的成员函数,只能作为普通函数 流插入,流提取运算符重载 流插入运算符”>”也可以被用来重载...“<<”运算符是有两个操作数的,它是一个双目运算符,平时貌似只给了一个操作数,形如cout< cout<<time; cin>>time; 重载流插入和提取运算符运算符函数,不能作为的成员函数,只能作为普通函数...这是一个规定,没有为什么 “>”重载的函数声明如下: istream& operator>> (istream& input, CTime& time);//输入流 ostream&...但仍然不能使用+运算符将一个CTime对象和一个int类型相加。为了实现,我们可以先将int类型转换为一个CTime的临时对象,然后在进行相加。...类型转换函数没有参数,没有返回类型。它是成员函数。 如 可以将CTime对象转换int类型

    67820

    剖析【C++】——与对象(中)——小白篇—超详解

    的参数是对本类类型对象的引用,通常用 const 修饰。 示例:Date 假设我们有一个 Date ,通过拷贝构造函数可以创建一个与已存在对象相同的新对象。...函数参数类型类型对象。 函数返回值类型类型对象。 为了提高程序效率,一般对象传参时尽量使用引用类型,返回时根据实际场景,能用引用尽量使用引用。...示例:运算符重载函数原型 5.2 赋值运算符重载 赋值运算符重载是一种常见的运算符重载形式,用于定义对象之间的赋值操作。 赋值运算符重载格式 参数类型:const T&,传递引用可以提高传参效率。...对象销毁,释放内存 赋值运算符重载的注意事项 赋值运算符只能重载的成员函数,不能重载成全局函数。...用户没有显式实现时,编译器会生成默认的赋值运算符重载,以值的方式逐字节拷贝。对于内置类型成员变量是直接赋值的,而自定义类型成员变量需要调用对应的赋值运算符重载完成赋值。

    12010

    C++初阶 和对象(下)

    拷贝构造函数只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类型对象创建新对象时由编译器自动调用。 1.2 为什么得是引用?...为什么这个形参得是被对象的引用呢,我直接传递我这个要拷贝的目标不可以吗,不是一样的操作吗。...注意: 1.不能通过连接其他符号来创建新的操作符:比如operator@ 2.重载操作符必须有一个类型参数 3.用于内置类型运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义 4...注意以上5个运算符不能重载。这个经常在笔试选择题中出现。这5个死记硬背记住就ok了。...) { Date tmp = *this; tmp += day; return tmp; } 2.3.3前置++和后置++运算符重载 在C++中前置++和后置++如果我们要对进行重载

    16010

    和对象(万字总结!深度总结了的相关知识)(中)

    命名:构造函数的名字与名相同(在C++中),没有返回类型(即使是void也没有)。 重载:构造函数可以被重载,即可以定义多个构造函数,参数列表不同以实现不同的初始化方法。...必须用于const成员或引用类型成员的初始化,因为它们只能被初始化一次。 2.4 内置类型和自定义类型: 内置类型没有构造函数,编译器自动管理其生命周期。...命名:析构函数的名字与名相同,但前面加一个波浪号(~),没有返回类型,也不接受参数。 不能重载:析构函数不能重载中只能有一个析构函数。...5.赋值运算符重载 运算符重载(Operator Overloading)是C++的一种特性,允许你为定义或重载运算符,以便让这些运算符能够处理自定义数据类型。...然而,这个重载函数通常不能作为的成员函数,以下是一些原因: 运算符的左操作数必须是非类类型: 流插入运算符<<的左操作数通常是标准输出流对象(如std::ostream)。

    9410
    领券