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

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

istream形参引用 一点规范:输入运算符必须处理可能失败的情况,生成符合规范的元素输入或其他方法,要尽可能保持流的正常工作且负责让流从错误中恢复 14.3 算术和关系运算符 如果定义了算术运算符...,一般也会定义复合赋值运算符,此时一般使用复合赋值运算符来定义普通的算术运算符(也就是让普通的算术运算符通过包装复合赋值运算符来实现) 相等运算符的一般语义是比较类的每一个数据成员的值,当全部相等时才标识相等...= 如果存在唯一可靠的一种,而且若同时包含了==的话,还应该保证<和==的结果一致时才定义< 14.4 赋值运算符 之前有了移动构造和拷贝构造赋值运算符,但类还可以自定义赋值运算符...,而是包装解引用运算符 重载的箭头运算符有要求必须返回类的指针或者某个对象,但是解引用运算符没有要求 14.8 函数调用运算符 重载函数调用运算符让我们可以像使用函数一样使用类的对象,这样的类由于能有自己的状态所以比普通的函数更加灵活...而是否有默认的拷贝/移动函数要视捕获的数据成员类型而定 标准库functional中定义了一系列表示算术运算符,赋值运算符和默认析构函数的模板类,我们可以用这些类来实现简单的类计算或将其作为可调用对象传递到一些容器中替换掉默认的运算符改变容器的操作

80810

九、运算符重载

} 算术运算符重载 在C++中,算术运算符重载允许你为自定义类型(如类)定义算术运算符的行为。...赋值运算符(=):虽然赋值运算符是算术运算符之一,但其重载有特定的要求和规则(例如,防止自赋值和确保返回值类型为对象的引用),需要特别注意。...通过重载算术运算符,你可以让你的类更加直观和易于使用,仿佛它们是基本数据类型一样。...重载赋值运算符时,需要注意以下几个关键点: 返回值:重载的赋值运算符应该返回对当前对象的引用(T&),这允许连续赋值。 自赋值检查:确保赋值操作不会将对象赋值给其自身。...赋值和移动:实现了复制赋值运算符和移动赋值运算符,允许对象之间的值传递和资源的移动。 类型转换:提供了到std::string和char*的隐式类型转换,方便与标准库和C风格字符串的交互。

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

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

    如果类同时定义了算术运算符和相关的复合赋值运算符,则通常情况下应该使用复合赋值来实现算术运算符 1....=的,那么一个对象应该<另一个 赋值运算符 我们之前定义过拷贝赋值和移动赋值运算符,它们可以把类的一个对象赋值给该类的另一个对象。类还可以定义其他赋值运算符使用别的类作为右侧运算对象。...,复合赋值运算符通常情况下也应该这么做,这两类运算符都应该返回左侧运算对象的引用。...与下标的原始定义兼容,我们需要确保: 下表运算符通常以所访问元素的引用作为返回值,这样下标可以出现在赋值运算符的任意一端 最好定义下标运算符的常量和非常量版本,当作用于一个常量对象时下标运算符返回常量引用以确保我们不会给返回的对象赋值...SmallInt,然后使用SmallInt的+;也可以将s3转换成int,对int执行内置的加法运算 如果我们对同一个类既提供了转换目标是算术类型的类型转换,也提供了重载的运算符,则将会遇到重载运算符与内置运算符的二义性问题

    1.1K10

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

    这里前4个(构造函数、析构函数、拷贝构造和赋值重载)是重难点。 C++11以后还会增加两个默认成员函数,移动构造和移动赋值。...(选择题里面常考,要记一 重载操作符至少有一个类类型参数,不能通过运算符重载改变内置类型对象的含义,如: int operator+(int x,int y) 8、一个类需要重载哪些运算符,是看哪些运算符重载后有意义..._day) { return true; } return false; } 常见的运算符重载         我们基本上可以重载所以的算术运算符、关系运算符和赋值运算符等, 算术运算符:+...1、赋值运算符重载是一个运算符重载,规定必须重载为成员函数。...赋值运算重载的参数建议写成1.const 当前类类型引用,否则会传值传参会有拷贝 2、有返回值,且建议写成当前类类型引用,引用返回可以提高效率,有返回值目的是为了支持连续赋值场景。

    33210

    第 14 章 重载运算与类型转换

    算术和关系运算符 14.4 赋值运算符 14.5 下标运算符 14.6 递增和递减运算符 14.7 成员访问运算符 14.8 函数调用运算符 14.9 重载、类型转换与运算符 ---- 14.1 基本概念...所以,不建议重载逗号、取地址、逻辑与和逻辑或运算符。 重载运算符的返回类型通常情况下应该与其内置版本的返回类型兼容。...---- 14.3 算术和关系运算符 如果类同时定义了算术运算符和相关的复合赋值运算符,则通常情况下应该使用复合赋值运算符来实现算术运算符。...如果不满足这个条件,那么这个类也许不定义运算符会更好。 ---- 14.4 赋值运算符 除了拷贝赋值和移动赋值运算符之外,标准库中还定义了第三种赋值运算符,接受花括号内的元素列表作为参数。...而如果使用命名的函数来调用时,成员函数和非成员函数不会彼此重载。如果我们对一个类既提供了转换目标是算术类型的类型转换,也提供了重载的运算符,则将会遇到重载运算符与内置运算符的二义性问题。

    1.1K60

    【Modern C++】深入理解左值、右值

    编程语言CPL第一次引入了值类别,不过其定义比较简单,即对于赋值运算符,在运算符左边的为左值,在运算符右边的为右值。...这五种类别的分类基于表达式的两个特征: 具名(identity):可以确定表达式是否与另一表达式指代同一实体,例如通过比较它们所标识的对象或函数的(直接或间接获得的)地址 可被移动:移动构造函数、移动赋值运算符或实现了移动语义的其他函数重载能够绑定于这个表达式...glvalue rvalue:可被移动的表达式,prvalue和xvalue都属于rvalue 用图表示如下: 从glvalue和rvalue出发,将具名(indentity)和可移动两个特征结合起来...查了相关资料,做了些汇总,基本覆盖了所有的类型: 变量名、函数名以及数据成员名 返回左值引用的函数调用 由赋值运算符或复合赋值运算符连接的表达式,如(a=b, a-=b等) 解引用表达式*ptr 前置自增和自减表达式...在确保其他变量不再被使用、或即将被销毁时,通过“盗取”的方式可以避免内存空间的释放和分配,能够延长变量值的生命期。(通过右值引用来续命)。

    1.2K21

    左右值引用和移动语义

    : 拥有身份 (identity):可以确定表达式是否与另一表达式指代同一实体,例如通过比较它们所标识的对象或函数的(直接或间接获得的)地址; 可被移动:移动构造函数、移动赋值运算符或实现了移动语义的其他函数重载能够绑定于这个表达式...常见的纯右值有: 除字符串字面值以外的字面值 返回非引用类型的函数调用 后置自增/减的运算符链接的表达式(如i++/i--) 算术/逻辑/比较表达式(如a+b,a&&b,a==b) 取地址表达式(如&a...将亡值的产生与右值引用的产生而引起的,对于将亡值我们常用到的有: 返回类型是右值引用的函数调用或重载运算符的表达式(如std::move(x)) 转换为右值引用的转换函数的调用表达式(如static从函数形参移动构造它的目标 A a2(std::move(a1));// 从亡值移动构造 } 2.3 移动赋值运算符 一个类 T 的移动赋值运算符是名为 operator=的非模板非静态成员函数...A\n"; a1 = f(A("a")); // 从右值临时量移动赋值 std::cout 从亡值移动赋值 A\n"; a2 = std::move(a1); //

    1.1K40

    《流畅的Python》第十三章学习笔记

    运算符重载的作用是让用户定义的对象使用中缀运算符或一元运算符 中缀运算符 是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法...这些特殊方法只有一个参数self 需要遵循一个基本规则:始终返回一个新对象。不能修改self,要创建并返回合适类型的新实例。...一元取负算术运算符 -:__neg__ 一元取正算术运算符 +:__pos__ 对整数按位取反 ~:__invert__ 重载加法运算符+ 定义__add__(self, other)方法 ?...other 比较运算符 正向和反向调用使用的是同一系列方法 对==和!...比较运算符 增量赋值运算符 增量赋值运算符不会修改不可变目标,而是新建实例,然后重新绑定

    64610

    【C++】Chapter01 类与对象

    封装本质上是一种管理,让用户更方便使用类。 对于stack的实现C语言与C++的区别: 从底层来说没有区别。...在介绍赋值运算符重载之前我们先来介绍运算符重载。 运算符重载 普通的运算符是类似于“=”、“+”等带有运算含义的符号,运算符重载就是具有特殊函数名的函数,这些函数名都会接需要重载的运算符。...注意1:当我们在使用重载运算符的时候,不能改变内置类型的运算符的含义。 比如对于+这个运算符,它依旧起着类似于1+1=2的作用,这是不会改变的。...赋值运算符重载 赋值运算符重载 (operator=) 是 特殊的运算符重载 我们知道,在C++中,=这个运算符的含义是赋值,所以这也是它名字的由来。 那么对于赋值运算符的重载,会有哪些好处呢?.../ 复制 `other` 的资源 return *this; // 返回自身引用 } }; 赋值运算符重载的关键点 参数类型:const ClassName&

    31200

    C++运算符重载详解

    可重载的运算符的种类 并不是所有C++中的运算符都可以支持重载,我们也不能创建一个新的运算符出来(比如Σ)。有的运算符只能作为类成员函数被重载,而有的运算符则只能当做普通函数来使用。...算术赋值表达式运算符 描述 值 运算符种类 += -= *= /= %= ^= &= |= >>= <<= 是否支持类成员 YES 是否支持普通函数 YES 运算单元 二元 返回类型 左值引用 算术赋值表达式除了具有上面说的算术运算的功能之外...return *this; } }; 从上面的例子里面可以看出: 算术赋值运算符的返回总是引用类型,而且要和运算符左边的参数类型保持一致。...一个类中可以使用多个函数运算符的重载,而且函数运算符重载时的参数个数以及返回类型都可以完全自定义。...这三个运算符重载的目的主要用于智能指针以及代理的实现。也是是C++从语言级别上对某些设计模式的实现。

    1.7K30

    重载运算符操作说明(一)

    重载的运算符有特殊的名字的函数: 重载运算符名字由关键字operator 和其后要定义的运算符号共同组成。 重载的运算符也包含返回类型,参数列表,以及函数体。...下面是总结的一些是否能被重载运算符: 使用重载的运算符本质上是一次函数调用 所以这些关于运算对象求值顺序规则无法应用到重载的运算符上 一般不重载逗号运算符和取地址运算****符 因为这两种运算符已经有了内置的含义...明智的使用重载运算符 运算符重载 每个运算符在用于内置类型时都有比较明确的含义。 当在内置的运算符和我们自己的操作之间存在逻辑映射关系时,运算符重载的效果最好。...赋值和复合赋值运算符赋值运算符的行为与复合版本的类似 :赋值之后,左侧运算对象和右侧运算对象的值相等,并且运算符应该返回它左侧运算对象的一个引用。...重载的赋值运算应该继承而非违背其内置版本的含义。 如果类含有算术运算符则最好也提供对应的复合赋值运算符。

    30520

    【C++ 语言】面向对象 ( 函数重载 | 运算符重载 | 运算符重载两种定义方式 | 拷贝构造方法 | RVO 优化 | NRVO 优化 )

    , 其本质是定义一个方法 , 该方法有固定的格式去定义 , 调用该方法的时候 , 可以使用函数形式调用 , 也可以使用运算符进行运算 , 其 本质还是类的函数调用 ; 重载运算符完整调用 , 即调用上面定义的整个...然后返回一个新的 Operator 对象 , 其 number 成员变量值是两个 Operator 的 number 成员变量值之积 ; //类外部定义云算符重载 // 使用该重载云算符时 , 将两个对象相乘...<< endl; //运算符重载简化写法 //+ 是在 Operator 类中自定义的运算符重载 //其作用是返回一个对象 , 其number成员变量值是 o1 和 o2 中number成员变量之积...; 从 return o2; 开始分析 , 返回 o2 对象 , 系统会将栈内存中的 o2 对象 拷贝到一个临时对象中 , 这里调用了一次拷贝构造方法 ; 然后将临时对象又赋值给了返回值接收的对象 ,...: " << o3.number << endl; //运算符重载简化写法 //+ 是在 Operator 类中自定义的运算符重载 //其作用是返回一个对象 , 其number成员变量值是

    69920

    Rust运算符重载:让类型更灵活优雅

    y x ^ y x > y 复合赋值算术运算符 std::ops::AddAssign std::ops::SubAssign std::ops::MulAssign std::ops...从 Rust 1.50 开始,错误检查运算符 ? 仅适用于 Result 值和 Option 值,不过 Rust 也在努力将其扩展到用户定义类型。...同样,逻辑运算符 && 和 || 仅限于 bool 值。.. 运算符和 ..= 运算符总会创建一个表示范围边界的结构体,& 运算符总是会借用引用,= 运算符总是会移动值或复制值。...当需要一个可调用的值时,通常只需编写一个闭包即可 注意 虽然运算符重载可以让你的代码更加简洁和易读,但是过度使用运算符重载可能会使代码变得难以理解。...因此,应该谨慎使用运算符重载 公众号开了留言功能,欢迎大家留言讨论交流 如果喜欢本文章或感觉文章有用,动动你那发财的小手点赞、收藏、关注再走呗 ^_^

    32910

    【C++】一文掌握C++的四种类型转换 --- static_cast、reinterpret_cast、const_cast、dynamic_cast

    内置类型中分为算术类型和空类型。其中算术类型包含字符,整型,布尔值和浮点数。空类型不对应具体的值,仅用于一些特殊的场合,例如最常见的是,当函数不返回任何值时使用空类型作为返回类型。...2 类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换...只有 const_cast 可以做到去常,并且还要配合使用volatie关键字。const_cast最常用的用途就是删除变量的const属性,方便赋值。会将一个稳定的变量变成不稳定的!...去常操作常常在函数重载中进行使用:比如在类内我们要实习一个功能:比较两个字符串的大小。...C++通过以下方式来支持RTTI: typeid 运算符 dynamic_cast 运算符 decltype 4 使用建议 强制类型转换干扰了正常的类型检查,因此我们强烈建议程序员避免使用强制类型转换。

    1.1K10

    Java Review (三、运算符)

    算术运算符 赋值运算符 比较运算符 逻辑运算符 位运算符 类型相关运算符 算术运算符 Java支持所有的基本算术运算符,这些算术运算符用于执行基本的数学运算:加、减、乘、除和求 余等。...赋值运算符 赋值运算符用于为变量指定变量值,与C类似,Java也使用 =作为赋值运算符。通常,使用赋值运 算符将一个直接量值赋给变量。...int a=5; 也可使用赋值运算符将一个变量的值赋给另一个变量。 int a=5; int b=a; 位运算符 Java支持的位运算符有如下7个。 &: 按位与。 |: 按位或。 〜:按位非。...左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。...+a); 扩展后的赋值运算符 赋值运算符可与算术运算符、位移运算符结合,扩展成功能更加强大的运算符。

    47620

    面试官:请说出4种不使用第三方变量交换两个变量值的方法

    前几天有个小伙伴去面试,被面试官的一个问题劝退了:请说出几种不使用第三方变量交换两个变量值的方法。 问题有点绕,好不容易缕清了面试官的问题,却发现答不上来。一时间尴尬无比,只能硬着头皮说不会。...遇到交换变量值的问题,通常我们的做法是:定义一个新的变量,借助它完成交换。 代码如下: t = a; a = b; b = t; 但问题的重点是“不使用第三方变量”,那就变得“可爱”起来了。...很容易从图中看出,OB 的距离为 b + a,所以我们只需要将 b + a 赋值给 a 就可以完成两者的交换了。...在交换很大的数据类型时,该方法执行速度比算术算法快。因为它交换的是地址,而变量值在内存中是没有移动过的。 位运算 既然上边用到了位运算,那我们再说一种直接通过“异或“完成交换的方法。...理论上重载 “^” 运算符,也可以实现任意结构的交换; 以上就是今天的全部内容了

    57430

    C++入门 学习记录

    2.3.1算术运算符与赋值运算 2.3.2逗号运算、关系运算、逻辑运算、条件运算 例x = a > b ?...(算术运算符、关系运算、逻辑运算、位运算、复制运算)要求两个操作数的类型一致。...标准输出流指向屏幕,标准输入流赋值。从流获取数据称为提取,添加称为提取。 <<是预定义的插入付,作用在流类对象cout可以向标准输出设备输出。...,构造函数由编译器自动调用,无需手动调用 语法:类名 ( ){ } ①没有返回值,也不写void ②函数名称与类名相同 ③构造函数可以有参数,因此可以发生重载 ④程序在调用对象时自动调用构造,只调用一次...全局函数不加花括号,如 friend void goodGay(Building *building) 4.4.2 类做友元及成员函数做友元见课本 4.5运算符重载 4.5.1加号运算符重载

    15300

    C++新旅程:日期类的实现

    从基本概念、Java 驱动使用、数据操作、安全性能问题与解决、数据一致性事务处理,到数据模型设计、技术集成和存储图片优势等方面讲解详细、条理清晰,体现出作者深入的理解。...在函数体内,将源对象的成员变量值逐一赋值给当前对象的相应成员变量,从而实现对象的拷贝。四、获取某个月的具体天数日期类通常需要一个方法来获取指定月份的天数。...在函数中,首先判断是否为闰年的二月,如果是,则返回 29 天;否则,直接返回数组中对应月份的天数。五、赋值运算符重载编译器会自动生成默认的赋值运算符重载函数,但有时我们可能需要自定义其行为。...显式实现赋值运算符重载函数时,需要注意一些关键要点。...然后,将源对象的成员变量值赋值给当前对象的成员变量,并最终返回当前对象的引用。

    18210

    Python基础语法 原

    27 return 用于从函数返回计算结果。 28 try 包含可能会出现异常的语句,与except,finally结合使用。 29 while 循环语句。 30 with 简化Python语句。...31 yield 用于从函数依次返回值。 32 保留字 说明 三、代码规范 1、PEP8 为了写出优雅的代码,Python中经常使用PEP8规范,规定如下: 1.缩进与换行,每级缩进使用4个空格。...六、运算符 Python中有7种运算符,分别是: 算术运算符 比较运算符 赋值运算符 位运算符 逻辑运算符 成员运算符 身份运算符 1、算术运算符 算术运算符有以下几种: +加:两个对象相加。...^按位异或运算符:当两对应的二进位相异时,结果为1 (a ^ b) 输出结果 49 ,二进制解释:0011 0001 移动运算符:运算数的各二进位全部左移若干位,由"移动的位数,...a << 2 输出结果 240 ,二进制解释: 1111 0000 >>右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数。

    2.8K31
    领券