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

我想重载运算符'=‘,但在重载之后,运算符没有将正确的信息传递给对象

重载运算符"="是在C++中的一种特殊操作,用于给对象赋值。当我们重载运算符"="时,需要确保它能够正确地将信息传递给对象。

在重载运算符"="时,我们需要定义一个成员函数或者友元函数来实现赋值操作。这个函数应该接受一个参数,参数类型应该与对象类型相同或者兼容。在函数体内,我们需要将参数的值赋给对象的成员变量。

下面是一个示例代码,演示了如何重载运算符"=":

代码语言:cpp
复制
class MyClass {
public:
    int value;

    MyClass& operator=(const MyClass& other) {
        if (this != &other) {
            value = other.value;
        }
        return *this;
    }
};

int main() {
    MyClass obj1;
    obj1.value = 10;

    MyClass obj2;
    obj2.value = 20;

    obj2 = obj1;  // 调用重载的运算符"=",将obj1的值赋给obj2

    return 0;
}

在上面的示例中,重载的运算符"="被定义为成员函数,并且返回一个引用,以支持连续赋值操作。在函数体内,我们首先检查对象是否与参数相同,以避免自我赋值的情况。然后,我们将参数的值赋给对象的成员变量。

需要注意的是,重载运算符"="时,我们需要确保正确地处理对象的资源管理,例如动态分配的内存。如果对象包含指针成员变量,我们需要在赋值操作中进行深拷贝,以避免浅拷贝带来的问题。

总结起来,重载运算符"="时,我们需要确保它能够正确地将信息传递给对象,并且处理好对象的资源管理。这样才能保证运算符的正确性和可靠性。

腾讯云相关产品和产品介绍链接地址:

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

相关·内容

类和对象(中)

,但如果每次创建对象时都调用该方法设置信息,未免有点麻烦,有的时候甚至容易忘记初始化导致在Push时候出现错误,那能否在对象创建时,就将信息设置进去呢?...(即:不构造函数就是默认构造函数) 上述三种方法演示之后,还要说明就是构造函数第四个特征,可以进行重载,即我们方式1和方式2Date构造函数放在一起是没问题;但是对于第三个缺省参数来说...虽然说是可以,但在这里还是记录一下当时思考过程:在了解拷贝会发生死递归之后,但是又看见指针就不会死递归,就产生了一个这样疑惑:参是拷贝值产生死递归,用指针不也是地址,这个地址不也算是参数吗...注:操作符需要几个参数,我们就应该几个参数 接下来看看正确运算符重载: class Date { public: Date(int year = 1, int month = 1, int day...对于运算符重载,上面所描述都是大于1个操作数,即+、-、=等,但仍有单操作数运算符,比如++ ,因此在这里提及一下,下一篇仍然算是类和对象中,但主题是日期类实现,在日期类中将会把类和对象中剩下部分讲完

50200

类和对象之六大基础函数

,但如果每次创建对象时都调用该方法设置信息,未免有点麻烦,那能否在对象创建时,就将信息设置进去呢?...小小吐槽:(这里就为上文内置类型随机初始化打了补丁了,是为啥补丁不打到,如果使用编辑器自动生成构造函数,内置类型也给初始化算了,这个补丁打的 嗯咋说呢?...扩展:其实除了上述3点还有一处也可能会调用,就是赋值运算符“=”(本质上也是先拷贝一个副本,在赋给左值)也会调用(可以理解为右值,传给左值,不过这是左右值都为自定义类,所以库中没有相应代码可以调用,...5.1 运算符重载 C++在扩展了类功能后,又来一个新问题,在我们完成类定义后,我们定义类作为单独一个类对象除了能用于各种需求数据存储,但是不同对象之间却没有太多交流。...,使用编译器生成默认取地址重载即可,只有特殊情况,才需 要重载,比如让别人获取到指定内容(不过这样就无法取对象地址了);

54920
  • 【C++】拷贝构造函数和赋值运算符重载详解

    在C++中,拷贝构造函数通常用于一个对象值复制到另一个对象中(一个对象存在,一个对象不存在),以便在程序中进行对象赋值和传递操作时,能够确保对象内容被正确复制。...用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值方式逐字节拷贝。 注意:内置类型成员变量是直接赋值,而自定义类型成员变量需要调用对应类赋值运算符 重载完成赋值。...++: // 前置++和后置++都是一元运算符,为了让前置++与后置++形成能正确重载 // C++规定:后置++重载时多增加一个int类型参数,但调用函数时该参数不用传递,编译器 //自动传递...注意:this指向对象函数结束后不会销毁,故以引用方式返回提高效率 后置++: 前置++和后置++都是一元运算符,为了让前置++与后置++形成能正确重载,C++规定:后置++重载时多增加一个...如果你喜欢内容,记得点赞关注收藏博客,我会继续分享更多内容。⭐

    19710

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

    d1=d2,结果是d2修改成了d1,偷鸡不成蚀把米. Date&引用就不会调用拷贝构造函数去参,减少拷贝,提高效率...._month = 12; _year--; } _day += GetMonthDay(_year, _month); } return *this; } 到了这里,日期...前置++是返回+1之后结果,并且this是指向对象本身,所以我们可以使用引用返回,减少拷贝,提高效率....后置++是返回+1之前值,并且对象最终还需要被修改,所以我们需要创建一个临时对象用于记录+1前对象日期大小.除此之外,因为临时变量是在局部定义,所以我们必须值返回,不能引用返回. // 前置+..._month--; if (_month <= 0) { _month = 12; _year--; } } return tmp; } 3.8 比较运算符 比较运算符重载不多介绍了

    26020

    C++初阶类与对象(三):详解复制构造函数和运算符重载

    拷贝构造函数参数只有一个且必须是类类型对象引用(&),使用值方式编译器直接报错,因为会引发无穷递归调用 为什么会无限递归:当我们值调用函数时,首先参–>因为是值会调用新一个拷贝构造–>...函数参数类型为类类型对象 函数返回值类型为类类型对象 2.赋值运算符重载 2.1运算符重载 C++为了增强代码可读性引入了运算符重载运算符重载是具有特殊函数名函数,也具有其返回值类型,函数名字以及参数列表...此时用户再在类外自己实现一个全局赋值运算符重载,就和编译器在类中生成默认赋值运算符重载冲突了,故赋值运算符重载只能是类成员函数 用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值方式逐字节拷贝...std::ostream是一个抽象类,它不能被直接实例化 std::cout是标准输出流对象,已经在标准库中定义好了,并且支持输出运算符<<重载,所以传入参数就好了 3.const成员 const...这两个运算符一般不需要重载,使用编译器生成默认取地址重载即可,只有特殊情况,才需要重载,比如让别人获取到指定内容 好啦,这次就到这里啦,剩下内容快马加鞭!!!感谢大家支持!!!

    16910

    【C++】类与对象运算符重载、const成员、取地址重载

    今日更新了类与对象运算符重载、const成员、取地址重载内容 欢迎大家关注点赞收藏⭐️留言 赋值运算符重载 运算符重载 C++为了增强代码可读性引入了运算符重载运算符重载是具有特殊函数名函数...赋值运算符重载 赋值运算符重载格式 参数类型:const T&,传递引用可以提高参效率 返回值类型:T&,返回引用可以提高返回效率,有返回值目的是为了支持连续赋值 检测是否自己给自己赋值 返回*this...后置++: // 前置++和后置++都是一元运算符,为了让前置++与后置++形成能正确重载 // C++规定:后置++重载时多增加一个int类型参数,但调用函数时该参数不用传递,编译器自动传递...因为d1地址时, 类型是const Date*,而print函数this指针类型是Date*。发生了权限放大。...,否则不能修改成员变量 下面是对权限放大举例说明 取地址及const取地址操作符重载 这两个运算符一般不需要重载,使用编译器生成默认取地址重载即可,只有特殊情况,才需 要重载,比如让别人获取到指定内容

    13110

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

    — 1 — 运算符重载需求 C++ 预定义运算符,只能用于基本数据类型运算:整型、实型、字符型、逻辑型等等,且不能用于对象运算。...但是我们有时候又很需要在对象之间能用运算符,那么这时我们就要重载运算符,使得运算符能用于对象之间运算。...比如,在数学上,两个复数可以直接进行+、-等运算,但在C++中,直接+或-用于复数对象是不允许。有时会希望,让对象也能通过运算符进行运算。这样代码就更简洁,也容易理解。...如:c = a + b; 等价于c = operator+(a,b) 在上面的代码中,重载+号运算符普通函数,在Complex复数类中定义成了友元函数,目的是为了友元函数能访问对象私有成员,否则会编译报错...再来说一下返回值为什么是普通Complex对象,因为本次 - 号和 + 号运算符函数执行之后,需要返回一个新对象给到左值。

    1K40

    【c++】类和对象(五)赋值运算符重载

    operator==,这里会发现运算符重载成全局就需要成员变量是公有的,即成员不能是private私有的,那么封装性如何保证?...,d1在前与在后是不同,如果我们写一个小于函数运算符重载,顺序不同,意思刚好相反 我们有两种方式进行调用,这两种方式是相同: 在上面的讲解之后,相信大家对运算符重载有了一定了解,他就是允许自定义对象使用运算符...赋值运算符重载对象已存在时使用,用于一个对象值赋给另一个对象 目的:拷贝构造函数目的是创建一个新、状态相同对象副本。...自赋值在大多数情况下是可以工作,但是在特定情况下,如果没有正确处理,它可能会引起错误或意外行为。...,在构造函数中,默认申请了10个元素空间,然后存了4个元素1 2 3 4 s2对象调用构造函数创建,在构造函数中,默认申请了10个元素空间,没有存储元素 由于Stack没有显式实现赋值运算符重载,编译器会以浅拷贝方式实现一份默认赋值运算符重载即只要发现

    17910

    由浅入深理解面向对象思想组成模块

    当创建类新实例时,构造函数会自动被调用。通过构造函数,我们可以确保对象在创建时就被赋予合适初始状态。下面详细解释如何使用构造函数进行初始化操作,并以Date类为例进行说明。...,可以与之后讲解全缺省构造函数和无参构造函数之间不能函数重载进行区别。...带参构造函数可以在对对象进行初始化时候进行参,数值会直接进行初始化对象成员变量。...正确应该如下: Date Func2() { Date tmp(2024, 7, 5); tmp.Print(); return tmp; } (五)运算符重载运算符被⽤于类类型对象时...运算符重载以后,其优先级和结合性与对应内置类型运算符保持⼀致 不能通过连接语法中没有的符号来创建新操作符:⽐如operator@。 (.* :: sizeof ?: .

    7310

    【C++】类六大默认成员函数及其特性(万字详解)

    只能在“成员函数”内部使用。 this指针本质上是“成员函数”形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。...Time类析构函数,即当Date对象销毁时,要保证其内部每个自定义对象都可以正确销毁main函数中并没有直接调用Time类析构函数,而是显式调用编译器为Date类生成默认析构函数。...,简直是毫无违和感有没有: 既然拷贝构造函数像刚才那样构建是有问题,那么我们该如何正确构建拷贝构造函数呢?...<之后,直接使用运算符比较和调用operator<函数比较代码转为汇编代码后是完全一模一样: 注意,并不是运算符重载函数都要写成内置类型,而我们通常写成内置类型原因是防止其写在类外面不好访问私有的成员...&()const { return this; } 最后这两个运算符一般不需要重载,使用编译器生成默认取地址重载即可,只有特殊情况,才需要重载,比如让别人获取到指定内容!

    14110

    【C++初阶】—— 类和对象 (下)

    运算符重载 运算符重载 在一个自定义变量里,如果我们实现对它加减乘除,是无法直接使用,因此C++为了增强代码可读性引入了运算符重载运算符重载是具有特殊函数名函数 关键字operator 后面接需要重载运算符符号...用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值方式逐字节拷贝 这里我们要格外注意: 系统默认生成一个默认赋值运算符重载它和之前拷贝构造一样,发生是浅拷贝,内置类型成员变量可以直接使用...,而自定义类型成员变量需要我们自己调用对应类赋值运算符重载 前置++和后置++重载 关于前置++和后置++: 前置++:返回+1之后结果 后置++:是先使用后+1,因此需要返回+1之前旧值...,会自动调用析构函数 匿名对象特点不用取名字 因此当我们只是使用类中某一个函数时,我们能创建匿名对象!...总结 类和对象所有内容已经了解完毕,类和对象在整个C++上都有举足轻重作用,大家千万不要忽视,而类和对象重点在四个成员函数上,下节学习C++内存管理 谢谢大家支持本篇到这里就结束了,祝大家天天开心

    6110

    类和对象(2)

    关键字operator后面接需要重载运算符符号 重载运算符函数参数个数和该运算符作用运算对象数量一样多。...如果第一个重载运算符函数是成员函数,则第一个运算符对象传给隐式this指针,因此运算符重载作为成员函数时,参数比运算对象少一个。 运算符重载以后,其优先级和结合性与对应内置操作符运算符保持一致。...注意以上5个运算符不能重载。 一个类需要重载哪些运算符,是看哪些运算符重载后有意义,比如Date类重载operator-就有意 义,但是重载operator+就没有意义。...要重载,比如让别人获取到指定内容!  ...,使用编译器生成默认取地址重载即可,只有特殊情况,才需 要重载,比如让别人获取到指定内容。

    8810

    类和对象运算符重载

    _day; } 该代码就是对“”运算符重载之后通过使用”“就可以对比日期类两个对象(根据该运算是否有意义来决定)。 使用时代码就是如此:d1 == d2。...当运行到使用重载运算符时候就会进行调用重载函数: 赋值运算符重载 赋值运算符重载格式 参数类型:const T&,传递引用可以提高参效率 返回值类型:T&,返回引用可以提高返回效率,有返回值目的是为了支持连续赋值...尝试将其定义为非成员函数会导致编译错误,因为编译器期望赋值运算符是类成员。 语义问题:赋值运算符语义是一个对象值设置为另一个对象值。...正确做法是将其作为类成员函数来重载,以确保正确访问权限、自赋值保护以及符合C++语法和语义要求。...③这两个运算符一般不需要重载,使用编译器生成默认取地址重载即可,只有特殊情况,才需要重载,比如让别人获取到指定内容!

    10210

    【C++修行之道】类和对象(四)运算符重载

    他们之间各论各没有关系 运算符重载:让自定义类型可以使用运算符,并且控制运算符行为,增强可读性 函数重载:可以让函数名相同,参数不同函数存在。 多个同一运算符重载可以构成函数重载 二、....在语法上,&类名::成员函数名是用来获取成员函数地址标准方式 如果不使用&运算符,编译器可能会将OB::func解析为对成员函数调用 运算符在这里作用是明确告诉编译器:“是这个成员函数地址...0; } Date& operator=(const Date& d):这个函数重载了赋值运算符(=),允许我们使用=来一个Date对象值赋给另一个已经存在Date对象。...d; } // 出了作用域,返回对象还在没有析构,那就可以用引用返回,减少拷贝 // a、返回对象生命周期到了,会析构,值返回 // b、返回对象生命周期没到,不会析构,引用返回 int main...用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值方式逐字节拷贝。 注意:内置类型成员变量是直接赋值,而自定义类型成员变量需要调用对应类赋值运算符重载完成赋值。

    9210

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

    是不是构造函数可以重载啊,那我们重载一下给参数不就行了。 这样的话我们不知道初始化给什么初值时候就可以调用无参构造函数,自己指定初值的话调用有参数参不就行了。...哦豁,那也就是说,构造函数不一定非要自己写,如果我们自己没有定义构造函数,编译器会自动生成一个。只不过是无参嘛。...,那经过了上面的学习,我们现在创建一个对象一般都直接用构造函数对其进行初始化,初始化什么值参就行了。 那现在我们创建一个和d1一样对象,是不是可以用d1去初始化创建出来对象啊。...大家一下,首先我们这里是用已有的类对象去创建一个相同对象(类对象拷贝),所以会调用拷贝构造函数,那要调用函数是不是要先参啊,而值调用是啥(形参是实参一份临时拷贝),是不是实参拷贝...那C++引入了运算符重载之后呢,就使得我们能够这样去玩: 比较两个日期类对象d1,d2是否相等,直接这样: d1==d2 但是我们首先要知道自定义类型是不能直接作为这些操作符操作数

    10810

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

    赋值运算符重载 前言 一、运算符重载 定义 实例 注意要点 函数重载运算符重载区别 不同点 相似点 总结 二、赋值运算符重载 赋值运算符重载格式 赋值运算符重载要点 重载要点 值返回和址返回要点...总结 函数重载:可以让函数名相同,参数不同函数同时存在 运算符重载:让自定义类型可以使用运算符,并且控制运算符行为,增强可读性 他们之间各论各没有关系 多个同一运算符重载可以构成函数重载...值返回和址返回要点 可以看到值和址在遇到不同问题时有不同表现,如下,在运算符重载问题下,址调用比值调用效率更高,关于为什么要返回*this,见下面 正常赋值表达式都是支持连续赋值...*this; } // 后置++: // 前置++和后置++都是一元运算符,为了让前置++与后置++形成能正确重载 // C++规定:后置++重载时多增加一个int类型参数...我们流输出操作符 << 声明为友元函数,并在函数中实现输出对象内容。在主函数中,我们创建了一个名为objMyClass对象,并使用流输出操作符将其内容输出到标准输出流中。

    11910

    C++面向对象学习之运算符重载(1)

    当然上面这个例子可能不是那么科学,但作为对于初学重载同学来说已经够形象说明了~ 来看这样一个例子,让你用c++实现一个复数相加函数,你一定会想,这不是很简单吗,于是,学过类定义及其使用你很快就写出了这样一段代码...); Complex result=a.add(b); //Complex result=a+b; result.display(); return 0; } 但今天,让你用运算符重载方式解决这个问题...,另一个是形参对象 成员。 在运算符函数重载为成员函数后,如果出现含该运算符表达式,如 c1+c2,编译系统把 它解释为 c1.operator+(c2) 即通过对象 c1 调用运算符重载函数,...调用与之匹配运算符重载函数。 可以将以上两个运算符重载函数都作为友 元函数,也可以一个运算符重载函数(运算符左侧为对象) 作为成员函 数,另一个(运算符左侧不是对象)作为友元函数。 但不可能将两个都作为...,此外没有任何作用。 编译系统在遇到重载后置自增运算符时,会自动调用此函数。 请注意前置自增运算符“++”和后置自增运算符“++”二者作用区别。 前者是先自加,返回是修改后对象本身。 后者返回是自加前对象

    84130

    从零开始学C++之构造函数与析构函数(一):构造函数、析构函数、赋值与初始化、explicit关键字

    一、构造函数、默认构造函数 (1)、构造函数 构造函数是特殊成员函数 创建类类型对象,系统自动会调用构造函数 构造函数是为了保证对象每个数据成员都被正确初始化 函数名和类名完全相同 不能定义构造函数类型...//我们不能调用一个构造函数但没有提供参数(实例化对象),如 A a(); //因为是有歧义,我们也可以看成是声明了一个没有参数函数a,返回值是类型A一个对象 但在函数时候往往可以这样写...注意  Test t[2] = {10, 20}; 中10,20是当作参数传递给每个对象构造函数,如果没有对应构造函数,比如只有2个参数构造函数,那么编译是失败。...这个整数赋值给t对象     // 1、调用转换构造函数20这个整数转换成类类型 (生成一个临时对象)     // 2、临时对象赋值给t对象(调用是=运算符)     Test t2;     ...赋值运算符格式为:Test& Test::operator=(const Test& other);事实上如果没有自己实现,编译器也会实现一个默认赋值运算符,做事情跟我们现在实现函数一样。

    1.3K00

    C++之类和对象

    ,就没有必要再显示定义拷贝构造函数了,比如日期类: 可以看到,没有写拷贝构造,但是编译器生成默认拷贝构造d1变量成功拷贝给了d2。...这个经常在笔试选择题中出现 日期类运算符重载实现 再日常生活中我们经常会对日期进行计算,所以后面将用日期类来进行讲解,首先这里放上正确+=重载形式: class Date //全是内置类型,...此外还可以发现两件事,首先把这个运算符重载写在类中而不是类外,其次了一个参数。...,那就因小失大了,所以最好办法就是讲运算符重载写在类里面,否则是无法访问到成员变量: ---- 那么为什么在写运算符重载时候只了一个参数,而且是需要加天数而不对象呢?...因为我们在类中定义这个函数,所以第一个参数默认为隐藏this指针,也就是左参数必须是类对象,因此这个运算符应该要这样使用: 可以看到这样使用就没有任何问题了,但是这样可读性不高,重载这个运算符又显得没有意义了

    1.2K00

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

    首先,创建一个临时Date对象tmp,并将其初始化为当前对象副本。 然后,使用重载"+="运算符指定天数加到tmp对象上。 最后,返回tmp对象。...首先,创建一个临时Date对象tmp,并将其初始化为当前对象副本。 然后,使用重载"-="运算符指定天数从tmp对象上减去。 最后,返回tmp对象。...在某些情况下,我们可能会在const对象上使用比较运算符。比如,如果我们一个const对象与另一个const对象进行比较,我们需要确保比较运算符能够在const对象正确地进行比较。...这样可以保证比较运算符能够正确地在const对象上使用,并且不会修改类状态。...如果允许常量对象递给非常量指针,就会破坏常量对象只读属性。为了确保对象常量性,C++编译器会报错。 所以,类里this指针接受一个常量会报错。

    8610
    领券