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

对于伪装运算符重载,返回引用是否有效?

对于伪装运算符重载,返回引用是否有效取决于具体的实现和使用场景。

在C++中,运算符重载可以通过成员函数或非成员函数来实现。对于伪装运算符重载,返回引用的有效性取决于返回的引用是否指向有效的对象或数据。

如果返回的引用指向有效的对象或数据,并且在运算符重载函数中没有对该对象或数据进行修改操作,那么返回引用是有效的。这样的设计可以实现链式调用,提高代码的可读性和简洁性。

然而,如果返回的引用指向的对象或数据在运算符重载函数执行完毕后被销毁或变得无效,那么返回引用就是无效的。这样的设计可能会导致悬空引用或访问无效内存的问题,引发程序崩溃或未定义行为。

因此,在实现伪装运算符重载时,需要确保返回的引用指向有效的对象或数据,并且在运算符重载函数执行完毕后仍然有效。这可以通过合理的对象生命周期管理和内存管理来实现。

总结起来,对于伪装运算符重载,返回引用是否有效取决于具体的实现和使用场景,需要确保返回的引用指向有效的对象或数据,并且在运算符重载函数执行完毕后仍然有效。

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

相关·内容

【笔记】《C++Primer》—— 第14章:重载运算和类型转换

,参数们都会被以未定义的顺序求值 尽管我们可以重载大多数的运算符,但是对于逗号运算符,取地址运算符和逻辑运算符我们一般不去重载它因为容易起误会 我们应只在操作含义清晰明了时才重载运算符,且有些运算符我们最好还限定其成员性...) 相等运算符的一般语义是比较类的每一个数据成员的值,当全部相等时才标识相等 如果类有判断两个对象是否相等的操作,最好就是重载出相等运算符减少学习成本 如果定义了相等运算符,一般也要能够判断一组对象中是否有重复的数据...的 14.5 下标运算符 下标运算符必须是成员函数 我们一般会定义两个版本的下标运算符,一个返回普通引用,一个接受常量参数并返回常量引用 常量版本是为了方便这个运算符用在常量函数中,确保作用在常量对象上时不会对这个对象进行赋值...int值,这样编译器才能区分出版本 14.7 成员访问运算符 箭头运算符必须是成员函数,解引用运算符一般也是类的成员 解引用运算符使用时应该检查目标是否在作用范围内 箭头运算符一般不会有自己的操作...,而是包装解引用运算符 重载的箭头运算符有要求必须返回类的指针或者某个对象,但是解引用运算符没有要求 14.8 函数调用运算符 重载函数调用运算符让我们可以像使用函数一样使用类的对象,这样的类由于能有自己的状态所以比普通的函数更加灵活

65610

C++运算符重载详解

运算符 描述 值 运算符种类 >> << 是否支持类成员 YES 是否支持普通函数 YES 运算单元 二元 返回类型 左值引用运算符是C++特有的一种运算符。...,而且对于普通函数来说第一个参数也必须是引用类型。...自增自减运算符 描述 值 运算符种类 ++ -- 是否支持类成员 YES 是否支持普通函数 YES 运算单元 一元 返回类型 普通类型,和左值引用 自增和自减运算符都是一元运算符,而且都会改变自身的内容...6.赋值运算符 描述 值 运算符种类 = 是否支持类成员 YES 是否支持普通函数 NO 运算单元 二元 返回类型 左值引用 赋值运算符只能用于类的成员函数中不能用于普通函数。...复引用运算符、地址运算符、成员访问运算符 描述 值 运算符种类 * & -> 是否支持类成员 YES 是否支持普通函数 除了* &支持外,->不支持 运算单元 1元 返回类型 任意 在C++语言中我可以可以对一个指针对象使用

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

    前置运算符的语义是“先操作,再返回”。 语义上:前置运算符的语义是先对对象进行递作,然后返回操作后的对象。这里的关键是“操作后的对象”。 效率:返回引用避免了不必要的创建和返回对象的拷贝。...链式操作:通过返回引用,可以支持链式操作。...例如,可以这样写代码:--date = anotherDate; 注意:this指向的对象函数结束后不会销毁,故以引用方式返回提高效率 后置运算符的语义是“先返回,再操作”。...语义上:后置运算符的语义是先返回操作后的对象,然后对对象进行递作。后置运算符的关键在于返回操作前的状态。 安全性:返回拷贝还避免了潜在的外部修改,此时得到的是一个独立的值,而不是对原始数据的直接引用。...而temp是临时对象,因此只能以值的方式返回,不能返回引用 1.7 输入输出流重载 // 友元函数声明,声明后可访问私有成员变量 friend ostream& operator<<(ostream&

    9210

    《C++Primer》第十四章 重载运算与类型转换

    重载输入运算符>> 通常情况下,输入运算符的一个形参是运算符将要读取的流的引用,第二个形参是将要读入到的(非常量)对象的引用。...,复合赋值运算符通常情况下也应该这么做,这两类运算符都应该返回左侧运算对象的引用。...与下标的原始定义兼容,我们需要确保: 下表运算符通常以所访问元素的引用作为返回值,这样下标可以出现在赋值运算符的任意一端 最好定义下标运算符的常量和非常量版本,当作用于一个常量对象时下标运算符返回常量引用以确保我们不会给返回的对象赋值...同时为了保持与内置版本一致,前置运算符应该返回递增或者递减后对象的引用。...对于形如point->mem的表达式来说,point必须是指向类的对象的指针或者是一个重载了operator->的类的对象。

    91110

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

    =等关系操作符的重载。 日期有效性检查:Date类需要实现对日期有效性的严格检查,确保月份正常,保证闰年的判断,符合各个月份的实际天数。...+和 - 运算符分别用于返回增加或减少指定天数后的日期对象,以及两个日期之间的天数差。 自增/自减运算符重载: 前缀和后缀形式的 ++ 与 – 运算符,用于向前或向后移动一天。...关系运算符重载: 、>=、<= 和 == 分别用于比较两个日期的大小关系。 != 判断两个日期是否不相等。 方法: show() 用于输出日期。...3.1 =重载 注意返回值类型,这里传回引用,效率更好。 Date& Date::operator=(const Date& d) { _year = d._year; _month = d....首先对于+= 我们需要准确知道该月的月份,保证日期的有效性。

    13210

    C++实战——日期类的实现

    最后,返回当前对象的引用(*this)。 这样,通过重载赋值运算符,可以实现Date对象之间的赋值操作。...首先,检查增加的天数是否小于0,如果是,则将其转换为正数,并使用递减运算符(-=)来实现减少指定天数的操作,然后返回当前对象的引用。 接着,将给定的天数累加到当前对象的_day成员变量上。...最后,返回当前对象的引用。 这样,通过重载"+="运算符,可以实现给Date对象增加指定天数的操作。...最后,返回当前对象的引用。 通过重载"-="运算符,可以实现给Date对象减少指定天数的操作。...首先,使用重载的"<"运算符比较当前对象和另一个日期对象d的大小。如果当前对象小于d,则返回true。 然后,使用重载的"=="运算符比较当前对象和d是否相等。如果相等,则返回true。

    8610

    【C++】运算符重载案例 - 字符串类 ④ ( 重载 双等号 == 运算符 | 重载 不等号 != 运算符 | 代码示例 )

    指针 或 引用 , 这里传入引用类型 ; operator==(String & s) 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 ; 此处返回值是 bool 类型..., 返回 true 或者 false 布尔值即可 ; bool operator==(String& s) 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ; 先对比数组的长度是否相等 ;...然后对比数组中每个元素是否相等 ; // 重载 双等号 == 运算符 bool String::operator==(String& s) { // 首先判断数组长度是否相等 if (this->m_len...=(String& s) 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ; 先对比数组的长度是否不相等 ; 然后对比数组中每个元素是否不相等 ; // 重载 不等号 !...// 直接返回对应 i 索引字符 return this->m_p[i]; } // 重载 双等号 == 运算符 bool String::operator==(String& s) { // 首先判断数组长度是否相等

    23820

    【C++】运算符重载案例 - 字符串类 ⑤ ( 重载 大于 > 运算符 | 重载 小于 < 运算符 | 重载 右移 >> 运算符 - 使用全局函数重载 | 代码示例 )

    , 对象一般传入 指针 或 引用 , 这里传入引用类型 ; operator>(String& s) 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 ; 此处返回值是 bool...指针 或 引用 , 这里传入引用类型 ; operator>>(String& s) 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 ; 此处返回值是 istream&...右移运算符重载 // 返回 istream& 引用类型 , 是为了支持链式调用 cin >> s1 >> endl; istream& operator>>(istream& in, String&...// 直接返回对应 i 索引字符 return this->m_p[i]; } // 重载 双等号 == 运算符 bool String::operator==(String& s) { // 首先判断数组长度是否相等...右移运算符重载 // 返回 istream& 引用类型 , 是为了支持链式调用 cin >> s1 >> endl; istream& operator>>(istream& in, String&

    48020

    【C++类和对象】拷贝构造与赋值运算符重载

    ,但实际上作为函数返回值在返回时是需要临时拷贝的; 2.赋值运算符重载 2.1运算符重载 在学习赋值运算符重载之前我们先来学习以下运算符重载; 首先运算符是一种特殊的符号,用于表示特定的操作或运算...d1; Date d2; d1 == d2;//我们想要进行日期类的对象进行判断是否相等就需要对运算符进行重载 return 0; } C++为了增强代码的可读性引入了运算符重载运算符重载是具有特殊函数名的函数...将右操作数的值赋给左操作数 // 返回左操作数的引用 return *this; } 参数类型:const 类型名&,传引用传参可以提高传参效率 返回值类型:类型名&,返回引用可以提高返回的效率...,有返回值目的是为了支持连续赋值 检测是否自己给自己赋值 返回*this :要符合赋值的含义 例如: class Date { public: Date(int year = 1900, int...,它默认生成了一个赋值运算符重载对于内置类型直接以字节的方式进行浅拷贝,对于自定义类型Time会去调用它的赋值运算符重载对于赋值运算符重载既然编译器生成的默认赋值运算符重载函数已经可以完成字节序的值拷贝了

    16110

    C++:12---运算符重载

    、-=、=运算符返回值为引用类型(&):函数执行完之后返回的是*this(对象本身)。...如果不加&,则返回的是临时对象 承接上一注意事项:前置++、--,返回值为引用。后置++、--,返回值不为引用 四、+、-、*、/、+=、-=的重载 //只实现+、*,+=。...,此处直接使用 return *this=temp; } 五、 赋值运算符(=)的重载 赋值运算符重载返回值应该为运算符左侧对象的一个引用,否则返回的是一个临时对象 如果没有写赋值重载运算符,编译器自动存在一个默认的...=运算符重载 用途:这两个运算符用来判断两个类对象中数据成员的值是否相等/不相等(可以在重载中判断单/多个成员是否相等) 设计规则: 通常情况下,==运算符应该具有传递性,例如:如果a==b和b==c...使用常量是因为不会改变对象的内容) 返回值:返回它的ostream形参 重载输入运算符>> 参数: 参数1:是运算符将要读取的流的引用 参数2:将要读入到的(非常量)的引用(使用非常量是因为输入运算符本身的目的就是将数据读入到这个对象中

    59030

    类和对象:运算符重载

    在学习运算符重载之前: 我们对于内置类型的运算是这样的:int = int + int; 但是我们对于自定义类型的类无法使用简单的运算符进行运算,我们需要特别得去写一个函数或者一段过程性代码来实现这个功能..._day; } 该代码就是对“”运算符重载,之后通过使用”“就可以对比日期类的两个对象(根据该运算是否有意义来决定)。 使用时的代码就是如此:d1 == d2。...当运行到使用重载运算符的时候就会进行调用重载函数: 赋值运算符重载 赋值运算符重载格式 参数类型:const T&,传递引用可以提高传参效率 返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值...**检测是否自己给自己赋值 返回*this **:要复合连续赋值的含义 //作为成员函数,赋值运算符重载函数: // 用Date类型引用返回使得可以连续赋值 Date& operator=(const...,所以在函数内定义一个对象进行储存++前的数据,不使用引用返回,使得在返回后构造函数,使程序正常进行。

    10210

    【C++】STL 容器 - vector 动态数组容器 ⑥ ( 使用迭代器遍历 vector 容器步骤 | 获取指容器向首元素的迭代器 begin 函数 | 获取末尾迭代器 | * 迭代器解引用 )

    * 运算符函数 ; *it 再后 , 对 迭代器 进行自增操作 , 自增 ++ 操作实际上调用的是 重载 ++ 运算符函数 , 用于递增迭代器 , 执行完毕后 , 迭代器指向下一个元素 ; it++...容器中 最后一个元素 之后一个位置的迭代器 , 返回的迭代器 不指向任何有效的元素 , 但可以被用于比较和遍历容器的末尾 ; 特别注意 : 修改 vector 容器后 , end() 函数返回的迭代器在容器被修改时不会自动更新..., 会造成异常 ; 3、iterator 迭代器类解引用操作 - operator* 重载运算符函数 使用 * 运算符 可以对 iterator 迭代器 对象 进行 解引用操作 , 在 iterator...类中 , 对 * 运算符进行了重载 , 函数原型如下 : reference operator*() const; operator*() 函数 会 返回 迭代器所指向的元素的引用 ; 解引用一个迭代器时...*it; 4、iterator 迭代器自增操作 - operator++ 重载运算符函数 使用 ++ 运算符 可以对 iterator 迭代器 对象 进行 自增操作 , 在 iterator 类中

    2.2K10

    【STL】vector的模拟实现

    为了避免浅拷贝带来的一些问题,所以我们在对赋值运算符重载时也会采用深拷贝的方式。...2.1.5、析构 析构函数的实现很简单,直接delete后,将迭代器置空即可: 2.2、迭代器相关 对于vector中的begin,返回其首地址即start,end返回finish即可。  ...2.3、运算符重载 2.3.1、[]重载 我们知道vector是可以用下标来实现对元素的访问,这里我们对[]进行重载,使我们的vector也支持下标访问。不过在实现时需要注意避免下标越界。  ..._start+pos)用到了=,假如我们不对其进行处理的话,我们知道一个类中会自带六大默认成员函数,其中就有默认赋值运算符重载,如果不涉及到向内存申请空间资源,我们就不需要手动写,但是一旦涉及到,我们就需要使用深拷贝的方式来实现...来说,代表的含义为有效元素个数,所以我们只需返回finish-start即可,而capacity代表整块空间的最大容量,因此返回end_of_storage-start即可: 2.4.2、reserve

    22330

    【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作

    返回时根据实际场景,能用引用尽量使用引用。...5.1 运算符重载函数概念 C++为了增强代码的可读性引入了运算符重载运算符重载是具有特殊函数名的函数(不用我们取名字),也是具其返回值类型,函数名字以及参数列表,其返回值类型与参数列表于普通的函数类似...这个经常在笔试选择题中出现(注意第一个不是, 是可以重载的) 并不是运算符都是需要重载的,需要看是否有存在的意义,参数部分需要对应顺序 5.2 运算符重载使用场景 祖师爷设置运算符重载的长期目标:自定义类型也可也使用运算符...&传递引用可以提高传参效率 返回值类型:typename&返回引用可以减少拷贝,提高返回的效率,有返回值目的是为了支持连续赋值 检查是否存在自己给自己赋值 返回*this:要复合连续赋值的含义...特性:用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝 默认生成赋值运算符重载对于内置类型与自定义类型处理方式 内置类型成员变量直接赋值的 自定义类型成员变量需要调用对应类的赋值运算符重载完成赋值

    10500

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

    下面我们讨论一下作为类成员函数的运算符重载函数的使用,及其函数的值返回引用返回的差别。   下面我们先看实例,而后逐步分析。   ...,临时变量与局部变量result的复制会调用拷贝构造函数,临时变量的生命周期是在拷贝构造函数运行完成后才结束,但如果运算符重载函数返回的是引用,那么不会产生临时变量,而局部变量result的生命周期在运算符重载函数退出后立即消失...//递增运算符是单目运算符,使用返回引用运算符重载函数道理就在于它需要改变自身。...对于递增运算符来说,它的意义在于能够改变自身,返回引用的函数是可以作为左值参与运算的,所以作为单目运算符重载它的函数采用返回引用的方式编写是最合适的。   ...对于运算符重载函数来说,最后我们还要注意一个问题,当运算符重载函数的形式参数类型全部为内部类型的时候,将不能重载

    50620

    C++:31---对象引用和赋值

    引用(reference)称之为“左值引用” 右值引用的使用方法 左值引用: 不能将其绑定到要求“转换的表达式、字面值常量、返回右值的表达式” 返回左值的函数,连同赋值、下标、解引用和前置递增/递减运算符...但是注意,我们上面介绍的move()函数,可以显式地将一个左值转换成对应的右值引用类型,因此参数可能是move()调用返回的结果,因此我们需要在函数运行前检测自我赋值 四、移动后,对象仍是有效、可析构的...从移动操作可以看出,一个对象(在此称为“源对象”)在被移动之后,源对象仍然保持有效,因此这个对象在操作完成之后仍然可以被销毁 五、合成的移动操作 “合成”意为“默认的” 对于移动操作,编译器的规则如下...④类似拷贝赋值运算符,如果有类成员是const的或是引用,则类的移动赋值运算符被定义为删除的 移动操作和合成的拷贝控制成员之间还有最后一个关系: 一个类是否定义自己的移动操作对拷贝构造函数如何合成有影响...,然后将结果返回 十一、重载引用函数 const成员函数重载时,可以定义两个版本:一个有const、一个没有const class Foo { public: //下面两者形成重载 Foo sorted

    1.7K10

    【C++】运算符重载 ⑫ ( 等于判断 == 运算符重载 | 不等于判断 != 运算符重载 | 完整代码示例 )

    引用 , 这里传入引用类型 ; operator==(Array& a) 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 ; 此处返回值是 bool 类型 , 返回 true...; // 等于判断 == 运算符重载 bool Array::operator==(Array& a) { // 首先判断数组长度是否相等 if (this->m_length !...= 运算符重载 bool Array::operator!=(Array& a) { // 首先判断数组长度是否相等 if (this->m_length !...函数" << endl; // 返回引用类型 // 返回引用就是返回本身 // 将 this 指针解引用, 即可获取数组本身 return *this; } // 等于判断 == 运算符重载...= 运算符重载 bool Array::operator!=(Array& a) { // 首先判断数组长度是否相等 if (this->m_length !

    16810

    C++类和对象(中)

    当我们写出默认拷贝函数完成复杂对象的拷贝时,就证明需要默认析构函数来释放对象 小技巧: 在函数传参与返回时,如果对象生命周期足够长,就可以考虑使用引用的方式,避免参数走拷贝构造->生成临时变量->再传递的路线..._day; //同上 return tmp; //tmp 为临时变量,不能传引用返回 } 此时就可以正常使用 d1 - d2 了 注:运算符重载和函数重载没有关系 ️operator操作符 operator...: 三目运算符 . 访问成员符 为何运算符能实现重载?...跟函数重载同理,保证函数修饰名不同,构成重载 下面是我测试出的部分运算符重载修饰规则: 基于运算符重载,我们可以介绍第四个天选之子:赋值重载函数 赋值重载函数 赋值重载函数的实现原理就是运算符重载...两个对象都已存在,使用引用,提高效率 为何判断相同? 避免资源浪费,当类的成员变量很多时,假如出现 d1 = d1 = d1 这种情况时,可以有效避免资源浪费 为何返回 *this ?

    21110

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

    文章目录 赋值运算符重载 运算符重载 特性 赋值运算符重载 传值返回: 传引用赋值: 两种返回选择 赋值运算符只能重载成类的成员函数不能重载成全局函数 总结 赋值运算符重载 运算符重载 运算符重载是...: C++为了增强代码的可读性引入了运算符重载运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通函数类似。...,返回值是根据运算符来决定,加减返回int类型,判断大小,使用bool类型:一个类要重载哪些运算符是看需求,看重载有没有价值和意义 特性 不能通过连接其他符号来创建新的操作符:比如operator@ 重载操作符必须有一个类类型参数..._day; } return *this; } 因此我们总结一下赋值运算符重载格式 参数类型:const T&,传递引用可以提高传参效率 返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值...,出了当前func函数作用域,就析构销毁了,那么不能用引用返回引用返回是存在风险的,因为引用对象在func函数栈帧已经销毁了 虽然引用返回可以减少一次拷贝,但是出了函数作用,返回对象还在,才能用引用返回

    12110

    【笔记】《C++Primer》—— 第三部分:类设计者的工具

    =&inp)来检测是否发生自赋值,若发生则不要进行内部的控制权转移部分 移动后的源对象必须保证是有效且可安全析构的状态,而且不能假设这个源对象的任何值 一个类可以既有移动拷贝也有拷贝构造,此时编译器将会进行最佳匹配...,但要求如果某个函数出现了引用限定符,则其具有相同参数列表的所有版本都需要有引用限定符 14 重载运算和类型转换 重载运算符的参数数量必须和这个运算符默认情况下的参数一致,而且其优先级和结合律无法改变即与默认情况一致...有的运算符(如加号+)有一元版本和二元版本,我们用参数数量区分它们 我们不能创建新的运算符 重载运算符的本质是函数调用,因此向逻辑运算符,逗号运算符之类的运算符内在的短路求值特性等将被舍弃,参数们都会被以未定义的顺序求值...但对于bool又有特殊对待,在一些条件表达中,例如if,for,逻辑运算符和三目运算符中,bool转换会自动进行显式转换 15 面向对象程序设计 强调下两个术语: 覆盖(重写) override...虚函数的返回类型也需要与基类一致,除非虚函数的返回类型是类本身的引用或指针时为了多态性会有特例 如果想要保证基类中某个虚函数一定会被覆盖,则可以在想要用来覆盖的函数后面加上override关键字 函数后面加上

    1.7K10
    领券