首页
学习
活动
专区
圈层
工具
发布

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

注意: 不能通过连接其他符号来创建新的操作符:比如operator@ 重载操作符必须有一个类类型参数 用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不能改变其含义 作为类成员函数重载时...因为这里是直接通过对象d3来调用的,所以肯定是类内的版本被调用。 d3 == d4这种简洁的写法在C++中会被自动转换为对operator==的调用。...在这个例子中,由于类内的版本是成员函数,且其参数与全局版本相同,所以编译器会优先选择类内的版本。...五、赋值运算符重载 1.赋值运算符重载格式 参数类型:const T&,传递引用可以提高传参效率 返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值 检测是否自己给自己赋值 返回...注意:后置++是先使用后+1,因此需要返回+1之前的旧值,故需在实现时需要先将this保存一份,然后给this + 1 // 而temp是临时对象,因此只能以值的方式返回,不能返回引用

37410

【C++干货基地】特殊函数名的函数:赋值运算符重载

一、运算符重载 C++ 中为了增加代码的可读性运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。...函数原型:返回值类型 operator操作符(参数列表) 注意: 不能通过连接其他符号来创建新的操作符:比如operator@ 重载操作符必须有一个类类型参数 用于内置类型的运算符,其含义不能改变,例如...,只是为了完成类是如何比较的而赋值运算符就是我们这里比较关键的了 赋值运算符重载 主要是赋值,把一个对象赋值给另一个对象 而 拷贝构造函数 主要是,同类型的对象创建初始化时调用 2.1 赋值运算符重载格式...参数类型:const T&,传递引用可以提高传参效率 返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值 检测是否自己给自己赋值 返回*this :要复合连续赋值的含义 这里我们为什么要讲返回值类型设定为...内置类型我们都知道是从后往前连续赋值的 也就是 10 先赋值给 b 然后 b 在赋值给 a,而我们并没有给赋值运算符重载返回一个值所以 就提示我们 二元 “=” 运算符没有找到与它匹配的操作数 所以我们的返回值就必须是

34800
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C++】类和对象(三) -- 拷贝构造函数、赋值运算符重载

    ,在类里面可以访问 //运行符顺序是对应的不能换 //但是我们成员函数是私有的,这里不能直接用该怎么解决?..._day; } //赋值运算符重载 //d3 = d5 //我们将d5赋值给了this指针,但是我们拿不到d3 //这里实际前面还有一个Date* const this //this就是d3...的地址,*this就是d3 //this指针在形参和实参的位置不能显示定义,但是在类里可以使用 //如果这里使用传值传参(特点就是不返回*this,返回的是*this的拷贝) Date& operator...Date d5(2025, 11, 27); d1 = d3 = d5; //赋值支持连续赋值,从右往左 //首先是d3 = d5,d3作为表达式的返回值再赋值给d1 //所以这里是俩次函数调用...支持连续赋值(如d1 = d3 = d5) C++ 中连续赋值(a = b = c)的执行逻辑是从右到左:先计算b = c,再将结果赋值给a。

    16010

    C++运算符重载(四)之赋值运算符重载

    这是因为运算符默认都是给内置类型用的。...return 0; } 二、重载运算符== 函数名:operator加上运算符 参数:有几个操作数就有几个参数,参数类型就是要操作对象的类型 返回值:看运算符运算后的返回值是什么 //存在this指针..._day; } 公有函数无法访问私有变量,所以运算符重载要写在类内当作成员函数c 三、日期赋值= 参数类型 返回值 检测是否自己给自己赋值 返回 * this 一个类如果没有显式定义赋值运算符重载,...d1 = d3 = d2;//连续赋值,链式编程思想 d1.print(); return 0; } 注意 不能通过连接其他符号来创建新的操作符:比如operator@ 重载操作符必须有一个类类型或者枚举类型的操作数...用于内置类型的操作符,其含义不能改变,例如:内置的整型 + ,不 能改变其含义 作为类成员的重载函数时,其形参看起来比操作数数目少1成员函数的操作符有一个默认的形参this,限定为第一个形参 .

    1.2K20

    类和对象(中):深入理解 C++ 类与对象:6 个默认成员函数核心解析

    d; // 输出“Time()被调用”,_t被初始化 return 0; } 补充:C++11 的补丁 为了解决内置类型不初始化的问题,C++11 允许在类内声明内置类型时给默认值: class...5.1 赋值运算符重载的 4 个关键特性 返回值类型 operator=(参数列表); 参数类型为const 类类型&(引用提高效率,const 避免修改原对象); 返回值类型为类类型&(支持连续赋值,...如d3 = d2 = d1); 必须显式检测 “自己给自己赋值”(如d1 = d1),避免无意义操作。...=(d1)) return 0; } 5.3 避坑点:赋值运算符只能是类的成员函数 不能把赋值运算符重载成全局函数 —— 因为编译器会默认生成类内的赋值运算符重载,全局版本会和它冲突: class...,所以返回引用是安全且合法的 5.5 运算符重载 (重点) 在 C++ 中,运算符重载是一项强大的特性,它允许我们为自定义类型赋予内置类型般的操作体验,极大提升了代码的可读性与易用性。

    22810

    C++ 运算符重载详解:赋值与取地址运算符及日期类实现

    ,普通函数的func1是无参的,但是成员函数func2是有参的(隐含的this指针) 重载操作符(和重载操作符是同一个意思)至少有一个类类型参数,不能通过运算符重载改变内置类型对象的含义,如:int...赋值运算符重载的参数建议写成const当前类类型引用,否则会传值传参会有拷贝 有返回值,且建议写成当前类类型引用,引用返回可以提高效率,有返回值目的是为了支持连续赋值场景。...return也没有使用传值传参的必要,* this出了作用域还在,d3的生命周期在main中,换用引用传参就不会调用拷贝构造直接返回了 这里先d5赋值给d3,d3作为赋值运算符重载的返回值赋值给...注意,这里d3赋值给d4是拷贝构造,用 d3 + 100 的结果创建并初始化 d4 但是当前的函数依旧实现的不好,他们逻辑是类似的,下面将他们复用了 在 C++ 中,tmp += day;...为了保证对象在输出时不会被意外修改,所以第二个参数用const Date&(const 引用),强制约束 “只能读、不能写”。

    21710

    C++类与对象(四):再谈构造函数(详解初始化列表)、Static成员

    1.再谈构造函数 1.1构造函数体赋值 根据之前介绍的内容:在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值,我们之前使用的构造函数都叫做函数体内赋初值 class Date...初始化可以在变量声明时进行,也可以在构造函数的初始化列表中进行(下面就介绍)。 赋值是在变量已经存在的情况下改变变量的值。...赋值操作符=用于将一个值赋给一个已经存在的变量 初始化是在变量创建时进行的,而赋值是在变量已经存在的情况下进行的 初始化可以只进行一次,而赋值可以进行多次 在一些情况下,初始化可能比赋值更加高效,因为它可以在对象创建时直接将初始值传递给对象...,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换的作用 用explicit修饰构造函数,将会禁止构造函数的隐式转换 构造函数是单参数 class A { public...//能这样做,是A的int单参数构造函数支持的 //其实隐式转换中间产生一个临时变量,临时变量是A类型的 const A& ra = 3;//给临时变量起别名,这时临时变量会在引用的作用域结束时销毁

    1.8K10

    类的优雅与对象的灵动:面向对象编程精粹(中)

    uu们仔细观察上面的代码话,我们可以清晰地发现,内置类型没有进行初始化,那么C++11 中针对内置类型成员不初始化的缺陷,又打了补丁:即内置类型成员变量在类中声明时可以给默认的缺省值。...重载操作符必须有一个自定义参数,不能去重载运算符改变其内置类型的行为(譬如将>重载成==) 用于内置类型的运算符,其含义不能改变,例如:内置的类型+,不能改变其含义....(对象成员调用),注意以上5个运算符不能重载. 5.3:赋值运算符重载 5.3.1:赋值运算符重载格式 参数类型:const T &,传引用的目的是提高效率,因为自定义类型在进行传值传参时会调用拷贝构造...返回值类型:T &,返回引用同样可以提高效率,有返回值的目的是为了支持连续赋值. 检测是否自己给自己赋值 返回 *this: 原因---->要符合连续赋值的含义....Date d2(d1); Date d3; d1.Print(); d2.Print(); d3.Print(); cout << endl; //赋值运算符重载:已经存在的对象,拷贝赋值给另外一个

    13110

    C++第五弹 -- 类与对象中篇下(赋值运算符重载函数 const成员函数 取地址操作符重载函数)

    赋值运算符重载 1. 运算符重载 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。...函数原型:返回值类型 operator操作符(参数列表) 注意: 不能通过连接其他符号来创建新的操作符:比如operator@ 重载操作符必须有一个类类型参数 用于内置类型的运算符,其含义不能改变,例如...赋值运算符的重载 赋值运算符重载格式 参数类型:const T&,传递引用可以提高传参效率 返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值 检测是否自己给自己赋值 返回*this.../ 注意:后置++是先使用后+1,因此需要返回+1之前的旧值,故需在实现时需要先将this保存一份,然后给this + 1 // 而temp是临时对象,因此只能以值的方式返回,不能返回引用...,实际修饰该成员函数 隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。

    27410

    【类和对象(中)】C++默认成员函数的奥秘(二):拷贝构造与赋值运算符重载

    3、第一个参数必须是当前类类型对象的引用,否则语法上会构成“无穷递归”,这个我们上篇文章给了一张非常形象的图,大家可以回去再看一下哈,注意内置类型都不大(不超过八个字节),自定义类型很复杂(拷贝都要去调用生成拷贝构造...8、重载操作符至少有一个类类型参数,不能通过运算符重载改变内置类型对象的含义,如: int operator+(int x, int y) 9、一个类需要重载哪些运算符,是看哪些运算符重载后有意义,比如...(三)赋值运算符重载的特点 1、赋值运算符重载是一个运算符重载,规定必须重载为成员函数。赋值运算重载的参数建议写成 const当前类类型引用,否则会传值传参会有拷贝。...(2024, 7, 6); d1 = d3; // 需要注意这里是拷贝构造,不是赋值重载 // 请牢牢记住赋值重载完成两个已经存在的对象直接的拷贝赋值 // 而拷贝构造用于一个对象拷贝初始化给另一个要创建的对象...2、const实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。

    19110

    【细品C++】深入了解类和对象(六大默认成员函数以及操作符重载)

    注意:C++11中针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量在类中声明时可以给默认值。 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。...return 0; } 在C++中,函数参数的缺省参数可以使用malloc、new或其他函数赋值。...:比如operator@ 重载操作符必须有一个类类型(非内置类型)参数 不能重新定义用于内置类型对象的操作符的含义,如内置的整型+,不能改变其含义,也不能使内置的整型数组增加+的操作符功能。...返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值。 检测是否自己给自己赋值。 返回*this:用于连续赋值。...表明在该成员函数中不能对类的任何成员进行修改。

    1.2K20

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

    .*) 6.重载操作符至少有一个类类型参数,不能通过运算符重载改变内置类型对象的含义。 7.要重载有意义的运算符。比如两个日期加就没有意义,两个日期减就有意义,两个日期减就是相差的天数。...赋值运算符重载的特点: 1.赋值运算符重载是一个运算符重载,规定必须重载为成员函数。赋值运算符重载的参数建议写成 const 当前类类型的引用 ,可以减少传值传参的拷贝。...int a, b, c; a = b = c = 1; //连续赋值 //从右往左,1赋值给c,返回值为c, //c赋值给b,返回值为b,b赋值给a,最后返回a 我们重载类类型自定义运算符也想实现这个连续赋值效果...= d3 = d1; //连续赋值 赋值运算符重载应该怎么实现?..._day; return *this; } 返回值是引用返回,你不用也可以,这只是一个建议,this现在相当于是d3的地址,*this就是d3,this指针在形参的位置不能显示写,没说不能在返回值的地方显示写

    1.6K10

    手撕C++类和对象(中)

    析构函数名是在类名前加上字符 ~。表达和构造函数的功能相反 ⽆参数⽆返回值。 (这⾥跟构造类似,也不需要加void) 没有参数,不能重载 ⼀个类只能有⼀个析构函数。...最终要的拷贝构造函数参数一定要是引用的写法 因为引用传参就是减少拷贝 建议在函数中加上const 因为不能因为形参的改变导致实参的改变 拷贝构造函数的第一个参数必须是类类型对象的引用 而且后面的参数可以有...= &d)//就是赋值对象不是自己的话就进行赋值拷贝的操作 // { // //我们现在将d3的值给d1 // _year = d..../*d1 = d3;*///将d3的值拷贝给d1 //赋值运算符的重载 //用于两个已经存在的连个对象直接的拷贝赋值 //这里要和拷贝构造进行区分 //拷贝构造是用于一个对象拷贝初始化给另一个要创建的对象.../*d1=d3;*///但是我们还是喜欢这么写简单些 //d1.operator=(d3); d1 = d2 = d3; //d3赋值给d2,返回值是d2,d2再赋值给

    29110

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

    (选择题⾥⾯常考,⼤家要记⼀ 下) • 重载操作符⾄少有⼀个类类型参数,不能通过运算符重载改变内置类型对象的含义,如: int operator+(int x, int y) • ⼀个类需要重载哪些运算符...赋值运算符重载是⼀个默认成员函数,⽤于完成两个已经存在的对象直接的拷⻉赋值,这⾥要注意跟 拷⻉构造区分,拷⻉构造⽤于⼀个对象拷⻉初始化给另⼀个要创建的对象。...赋值运算符重载的特点: 1. 赋值运算符重载是⼀个运算符重载,规定必须重载为成员函数。赋值运算重载的参数建议写成 const 当前类类型引⽤,否则会传值传参会有拷⻉ 2....(2024, 7, 6); d1 = d3; // 需要注意这⾥是拷⻉构造,不是赋值重载 // 请牢牢记住赋值重载完成两个已经存在的对象直接的拷⻉赋值 // ⽽拷⻉构造⽤于⼀个对象拷⻉初始化给另⼀个要创建的对象...• const实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进⾏修改。

    22310

    C++运算符重载(五)之关系运算符重载

    这是因为运算符默认都是给内置类型用的。...return 0; } 二、重载运算符== 函数名:operator加上运算符 参数:有几个操作数就有几个参数,参数类型就是要操作对象的类型 返回值:看运算符运算后的返回值是什么 //存在this指针..._day; } 公有函数无法访问私有变量,所以运算符重载要写在类内当作成员函数c 三、日期赋值= 参数类型 返回值 检测是否自己给自己赋值 返回 * this 一个类如果没有显式定义赋值运算符重载,...如果不写,会默认生成赋值重载,和拷贝构造行为类似,内置类型会完成值拷贝,自定义类型成员会调用他的赋值重载 //赋值重载 Date operator=(const Date& d)//返回值类型是Date...d3); d4.print(); Date d5 = d3;//这里是拷贝构造,只要是创建时定义就是拷贝构造,注意区分赋值重载。

    1.2K20

    【C++】类与对象篇三

    函数原型:返回值类型 operator操作符(参数列表) 注意: 1 . 不能通过连接其他符号来创建新的操作符:比如operator@ 2 . 重载操作符必须有一个类类型参数 3 ....用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义 4 . 作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this 5 ....参数类型:const T&,传递引用可以提高传参效率 (2) .返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值 (3) . 检测是否自己给自己赋值 (4) ....此时用户再在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是类的成员函数。 3....注意:后置++是先使用后+1,因此需要返回+1之前的旧值,故需在实现时需要先将this保存 一份,然后给this+1 // 而temp是临时对象,因此只能以值的方式返回,不能返回引用 Date

    24710

    《C++初阶之类和对象》【类的六大默认成员函数】

    返回类型 函数名(参数列表) const { // 函数体(不能修改成员变量) } const成员函数和非const成员函数的区别是什么?...通过重载赋值运算符,你可以定义如何将一个对象的值赋给另一个同类型的对象,实现深拷贝、资源管理或其他自定义逻辑。...赋值运算符重载:用于在对象创建后将一个对象的值赋给另一个已存在的对象。...调用赋值运算符重载,将d3赋值给d1 cout d3赋值给d1:" << endl; d1 = d3; // 调用operator= // 5....赋值运算符重载: * - 用于两个已经存在的对象之间的赋值 * - 在以下情况调用: * * d1 = d3; */ 对于像 Date 这样的类,其成员变量全部是内置类型

    22910

    C++:类和对象(中):拷贝构造与赋值运算符重载》

    一、拷贝构造函数 如果一个构造函数的第⼀个参数是自身类类型的引用,且任何额外的参数都有默认值,则此构造函数也叫做拷贝构造函数,也就是说拷贝构造是⼀个特殊的构造函数。...(选择题里面常考,大家要记一下) 重载操作符至少有一个类类型参数,不能通过运算符重载改变内置类型对象的含义,如: int operator+(int x, int y) 一个类需要重载哪些运算符,是看哪些运算符重载后有意义...//这也是和构造和析构的一个区别,构造和析构不会处理内置类型 int Getyear() { return _year; } //d1==d2,传d2就行,d1有this指针,但是在实参和形参不能直接写出来...(d1 == d2) 的问题,0 cout d3) << '\n';//1 return 0; } 0表示不相等,1表示相等 给大家大概看一下...赋值运算重载的参数建议写成const 当前类类型引用,否则会传值传参会有拷贝(const还可以有效防止权限扩大,让能传的参选择更多) 有返回值,且建议写成当前类类型引用,引用返回可以提高效率,有返回值目的是为了支持连续赋值的场景

    29510

    C++新旅程:类的拷贝构造函数 、赋值运算符重载 和const成员函数

    赋值运算符重载在了解赋值重载函数之前,我们需要了解什么是运算符重载,这里做一个简单的介绍。...2.0运算符重载函数(1)函数名:operator+需要重载的运算符符号(2)函数原型:返回值类型 operator+符号(形参参数列表)(3)必须有一个类类型的参数(4)简单代码示例2.1概念赋值重载...此时用户再在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是类的成员函数。...2.2赋值运算符重载格式返回值类型:类名&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值参数类型:const 类名&(传引用提高效率)返回*this(要符合连续赋值的含义)检测是否自己给自己赋值...const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员变量进行修改。

    57810

    C++六大默认成员函数

    类调用它的默认构造函数,而Time类的默认构造函数是编译器生成的,又是处理内置类型,所以VS不做处理,给出随机值 针对这个问题C++11打了个补丁:内置类型成员变量在声明时给缺省值,用缺省值初始化 using...操作符 运算符重载有以下注意事项: 不能创造新的操作符,例如C++不支持@这个符号 重载操作符必须有一个类类型的参数 void operator-(int a, int b)是不行的 // 参数类型必须要有一个是类类型...赋值运算符重载 赋值运算符重载用于一个已经存在的对象拷贝复制给另一个已经存在的对象,这里要和拷贝构造函数区分开。...以下是赋值运算符重载的特点: 赋值运算符重载是一个运算符重载,规定必须重载为成员函数,参数建议写成const 当前类类型引用,否则会传值传参产生拷贝 有返回值,建议写成当前类类型引用,引用返回可以减少拷贝...没有找到接受“void”类型的右操作数的运算符(或没有可接受的转换)` d1 = d2 = d3; 我们现在来着重讨论传值返回和传引用返回的区别: // 传值返回(非优化版本,强制拷贝构造) Date

    21810
    领券