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

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

第十四章 重载运算与类型转换 基本概念 当一个重载符是成员函数时,this绑定到左侧运算对象,成员运算符的(参数数量比运算对象的数量少一个 运算符函数必须要么是类的成员,要么最少含有一个类类型的参数...,则通常情况下应该使用复合赋值来实现算术运算符 1....为了与内置类型的复合赋值保持一致,类中的符合赋值运算符也要返回其左侧运算对象的引用: // 作为成员的二元运算符:左侧运算对象绑定到隐的this指针 Sales_data& Sales_data::operator...int() const { return val; } // ...其他成员 } 和的构造函数一样,编译器通常也不会将一个的类型转换运算符用于隐类型转换: SmallInt si =...3; // 正确:SmallInt的构造函数不是的 si + 3; // 错误:此处需要隐的类型转换,但类的运算符的 static_cast(si) + 3; // 正确:地请求类型转换

89910

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

成员运算符函数的(参数数量比运算对象的数量少一个。...operator+(data1, data2); 如果重载的运算符函数是成员函数的话,还可以像调用其他成员函数一样地调用运算符函数。...上面代码中,如果在使用 price检测到 is出错,则会执行默认初始化,将 item置为空,可以(略微)保护使用者免于受到输入错误的影响。...其中,捕获列表中的参数就是构造函数的参数,且是这个未命名类的数据成员 ,并且在 lambda对象创建时被初始化。而 lambda表达式中的参数与函数调用运算符参数对应。...转换必须通过的强制类型转换才可以使用,不过当用作条件判断时,编译器还是会自动执行的类型转换。

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

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

,一般也会定义复合赋值运算符,此时一般使用复合赋值运算符来定义普通的算术运算符(也就是让普通的算术运算符通过包装复合赋值运算符来实现) 相等运算符的一般语义是比较类的每一个数据成员的值,当全部相等时才标识相等...,用于让其他类型作为右侧对象,返回一个当前类型的引用 不论形参是什么,赋值运算符都必须定义为成员函数 复合赋值运算符不是非得是成员函数,但是我们也倾向于定义为成员函数 赋值运算符参数一般都是const...FOO temp = *this; /* do something... */ return temp; } 当我们需要调用递增递减运算符时,我们需要对后置版本的参数传递一个任意...,而是包装解引用运算符 重载的箭头运算符有要求必须返回类的指针或者某个对象,但是解引用运算符没有要求 14.8 函数调用运算符 重载函数调用运算符让我们可以使用函数一样使用类的对象,这样的类由于能有自己的状态所以比普通的函数更加灵活...,也就是我们必须使用强制类型转换才能使用 但是对于bool的特殊对待,在一些条件表达中,例如if,for,逻辑运算符和三目运算符中,bool转换会自动进行转换 对类进行隐类型转换最好尽量避免,因为语义常常比较模糊

64310

Java 编程问题:四、类型推断

向下转换或更好地避免var:编写一个程序,举例说明var和向下转换的组合,并解释为什么避免var。...在复合声明中使用 LVTI:解释并举例说明 LVTI 在复合声明中的用法。 LVTI 和变量范围:解释并举例说明为什么 LVTI 应该尽可能地缩小变量的范围。...但并非所有 Java 原始类型都可以利用字面值。在这种情况下,最好的方法是避免使用var。但让我们看看为什么!...因此,在这种情况下,最好避免var和的向下转型。 82 如果被调用的名称没有包含足够的类型信息,请避免使用var 好吧,var不是一颗银弹,这个问题将再次凸显这一点。...不允许使用 Lambda 和方法引用初始化器。此语句是var限制的一部分;因此,Lambda 表达式和方法引用需要的目标类型。

99740

C++学习知识点

6.初始化列表 C++中,构造函数与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。...为什么函数形参多是const修饰的引用 使用引用是防止值传递,值传递之前会将实参在堆栈产生一份拷贝,而引用则不会,因此引用传递会改变实参的值。...(3) 执行重载的构造函数,初始化申明在栈上的类对象,直接申明,不要使用new,如GPR gpr= GPR(6),其中类GPR构造函数是GPR(int i){}; (4) new申明的是类指针,...(5) 申明类指针并调用重载的构造函数,可以这样进行:GPR* gpr=new GPR(5); 13....关于C++中运算符重载函数有多少个参数的几点认识 (1)对于非成员运算符重载函数,若运算符为单目的,则有一个参数;若运算符为双目的,则有两个参数

1.7K20

Go语言圣经--作用域,基础数据类型,整型

(block)的概念推广到包括其他声明的群组,这些声明在代码中并未使用花括号包裹起来,我们称之为词法块。...内部的会覆盖外部的,如果查找失败,则报告“未声明的名字”这样的错误 6.词法域可以深度嵌套,因此内部的一个声明可能屏蔽外部的声明 7.隐词法域, 比如:for循环 函数体词法域,一个在for隐初始化词法域....基础类型、复合类型、引用类型和接口类型 2.基础类型,包括:数字、字符串和布尔型 3.复合数据类型——数组(§4.1)和结构体(§4.2) 4.引用类型包括指针(§2.3.2)、切片(§4.2))字典...10.类型不匹配的问题,需要类型转换,将一个大尺寸的整数类型转为一个小尺寸的整数类型,或者是将一个浮点数转为整数,可能会改变数值或丢失精度 11.整数字面值都可以用以0开始的八进制格式书写,例如0666...、%x或%X输出时生成0、0x或0X前缀,字符使用%c参数打印,或者是用%q参数打印带单引号的字符

45820

《Effective C++》读书摘要

三、const const返回值:避免(a*b)=c的错误; const参数:传递指向常量的引用; const成员函数:允许const属性的重载。 四、对象使用初始化 构造函数成员初始化列表; ?...三十、inline里里外外 隐:累内直接定义成(友)员函数,:inline关键字; 拒绝:复杂、虚函数、函数指针调用、模板、构造析构函数、影响动态连接或升级、对调试器的挑战(禁用)。...三十九、审慎使用private继承 私有继承表达的是实现关系,子类使用父类提供的接口,但是不继承; 能用复合不用私有继承; 如何实现final字段: ?...四十二、typename双重含义 模板声明中与class没有任何区别; 嵌套从属类型的指定,不能出现在基类列表和初始化列表中; ?...可以根据iterator_traits提供的类别标签区分迭代器类型,类别标签是空结构体类型,将标签作为函数参数可以保证编译器能在编译时期对类型进行检查。 ?

1.9K60

C++:类与对象(2)

特性5:如果类中没有定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户定义编译器将不再生成。        ...把拷贝构造函数的参数用const修饰就可以避免这种问题 特性3:若未定义,编译器会生成默认的拷贝构造函数。..._day; } return *this; } 思考: 1、为什么避免自赋值的情况 ?不避免可以吗?...2、为什么要用引用返回? 为了支持连续赋值!! 特性5:赋值运算符只能重载成类的成员函数不能重载成全局函数 思考: 1、之前我们实现其他运算符,也是可以定义全局函数啊,大不了传两个参数不就行了。...为什么这里赋值运算符重载必须是成员函数?  答:赋值运算符如果不显实现,编译器会生成一个默认的。

11310

Julia(建设者)

为了允许创建未完全初始化的对象,Julia允许new使用少于类型具有的字段数的函数来调用该函数,并返回未初始化未指定字段的对象。然后,内部构造函数方法可以使用不完整的对象,在返回之前完成其初始化。...end julia> z = Incomplete(); 虽然允许您使用初始化的字段创建对象,但是对未初始引用的任何访问都是一个立即错误: julia> z.xx ERROR: UndefRefError...参数构造器 参数类型为构造函数增加了一些麻烦。从参数类型回想起,默认情况下,可以使用给定的类型参数或给定构造函数的参数类型所隐含的类型参数来构造参数复合类型的实例。...如果没有任何提供的内部构造函数,则复合类型的声明会Point{T<:Real}自动Point{T}为每个可能的类型提供一个内部构造函数T<:Real,其行为类似于非参数默认内部构造函数。...这意味着您可以通过定义适当类型的方法来声明更灵活的构造函数,例如,抽象类型的构造函数。

64120

你不知道的JavaScript(中卷)一

NaN或者-0,便能使用==和===时就尽量不要使用Object.is() E.值和引用 1.引用就像一种特殊的指针,是来指向变量的指针(别名),如果参数不声明为引用的话,参数值总是通过值复制的方式传递...()和Number()来实现,不使用new,并不是创建封装对象; • 一元运算符+-被普遍认为是强制类型转换,也可以将日期转换成Unix时间戳 • ~运算符:首先将值强制类型转换为...3.转换为布尔值:使用Boolean()不用new,但最常用的是一元运算符!!...• 符号不能够被强制类型转换为数字(和隐都会产生错误),但可以被强制类型转换为布尔值(和隐都是true) E.宽松相等和严格相等 1....3.TDZ:ES6定义的(Temporal Dead Zone,暂时性死区),指的是由于代码中的变量还没有初始化而不能被引用的情况 E.函数参数 1.在ES6中,如果参数被省略或者值为undefined

1.2K20

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

参数无返回值类型。 一个类只能有一个析构函数。若未定义,系统会自动生成默认的析构函数。注意:析构函数不能重载; 对象生命周期结束时,C++编译系统系统自动调用析构函数。...Time类的析构函数*,即当Date对象销毁时,要保证其内部每个自定义对象都可以正确销毁 main函数中并没有直接调用Time类析构函数,而是调用编译器为Date类生成的默认析构函数 注意:创建哪个类的对象则调用该类的构造函数完成初始化...拷贝构造函数的参数只有一个且必须是类类型对象的引用使用传值方式编译器直接报错,因为会引发无穷递归调用。..._day; } //调用处: d1 == d2 => d1.operator==(d2); 3.2 赋值运算符重载 赋值运算符重载格式 参数类型:const T&,传递引用可以提高传参效率 返回值类型...:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值 检测是否自己给自己赋值 返回*this:要复合连续赋值的含义 Date& operator=(const Date& d) { if

6910

类和对象(中篇)

参数无返回值类型。 一个类只能有一个析构函数。若未定义,系统会自动生成默认的析构函数。...拷贝构造函数的参数只有一个且必须是类类型对象的引用使用传值方式编译器直接报错,因为会引发无穷递归调用。...拷贝构造函数典型调用场景: 1 使用已存在对象创建新对象 2 函数参数类型为类类型对象 3 函数返回值类型为类类型对象 注意: 为了提高程序效率,一般对象传参时,尽量使用引用类型,返回时根据实际场景...,能用引用尽量使用引用。...T&,传递引用可以提高传参效率 2 返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值 3 检测是否自己给自己赋值 4 返回*this :要复合连续赋值的含义 例如:

7310

【C++修炼之路】3. 类和对象(中)

(提供多个构造函数,多个初始化方式) 如果类中没有定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户定义编译器将不再生成。...对于上面的第五个特性(如果类中没有定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户定义编译器将不再生成。)...拷贝构造函数的参数只有一个且必须是类类型对象的引用使用传值方式编译器直接报错,因为会引发无穷递归调用 为什么传值会无穷递归呢?...当然了,内置类型还是按照正常缺省的方法进行初始化才是最简单的方式。 若未定义,编译器会生成默认的拷贝构造函数。...返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值 检测是否自己给自己赋值 返回*this :要复合连续赋值的含义 赋值运算符只能重载成类的成员函数不能重载成全局函数

49300

【c++】类与对象(中)

一旦用户定义,编译器将不再生成。 构造函数其特征如下: 函数名与类名相同,且无返回值。 对象实例化时编译器自动调用对应的构造函数。 构造函数可以重载。...无参数无返回值类型。 一个类只能有一个析构函数。若未定义,系统会自动生成默认的析构函数。注意:析构函数不能重载 对象生命周期结束时,C++编译系统系统自动调用析构函数。...拷贝构造函数的参数只有一个且必须是类类型对象的引用使用传值方式编译器直接报错,因为会引发无穷递归调用。...: 5.2赋值重载函数 参数类型:const T&,传递引用可以提高传参效率 返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值 检测是否自己给自己赋值 返回*this...用户没有实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。注意:内置类型成员变量是直接赋值的,而自定义类型成员变量需要调用对应类的赋值运算符重载完成赋值。

12610

【C++】类和对象(中)(万字详解)

, 7, 6); // 无参数时,要这样调用,不可以Data d3();,会与函数声明发生冲突 //,就相当于 Data func();,是错误的 Date d3; return 0; } 如果类中没有定义构造函数...无参数无返回值类型。 3. 一个类只能有一个析构函数。若未定义,系统会自动生成默认的析构函数。 注意:析构 函数不能重载,因为没有参数,所以不存在析构函数。 4....---- 5.运算符重载 1.为什么要重载运算符 为了让自定义类型可以使用 运算符 对于日期类,我们会经常用到,某个日期加多少天来得到另一个日期。...---- 6.赋值运算符重载 1.赋值运算符重载格式 参数类型 : const T& ,传递引用可以提高传参效率(赋值 返回值类型 : T& ,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值...(像有双操作数的运算符,前后顺序就是参数顺序) 参数加const是因为原赋值对象不希望被改变,引用作为参数可以避免拷贝;返回类型为引用是因为可以避免调用一次拷贝构造;遇到连等的情况:d1=d2=d3;

42230

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

通过构造函数,我们可以确保对象在创建时就被赋予合适的初始状态。下面将详细解释如何使用构造函数进行初始化操作,并以Date类为例进行说明。...构造函数可以重载。 如果类中没有定义构造函数,则C++编译器会⾃动⽣成⼀个⽆参的默认构造函数,⼀旦用户定义编译器将不再⽣成。...若未定义,系统会自动生成默认的析构函数; 对象生命周期结束时,C++编译系统系统自动调用析构函数,即使我们写析构函数,对于⾃定义类型成员也会调⽤他的析构,也就是说⾃定义类型成员⽆论什么情况都会⾃...为什么拷贝构造函数参数一定要以引用的形式? // 错误的写法 Date(const Date d) { _year = d._year; _month = d....前置++ 前置递增运算符直接修改对象本身,并返回修改后的对象的引用。返回引用的原因是为了提高性能和节省内存。由于前置递增运算符直接修改对象,返回引用避免了不必要的对象拷贝。

6710

两万字总结《C++ Primer》要点

::: 复合类型 定义:复合类型是基于其他类型定义的类型。 1.引用 引用:为对象起另外一个名字。 ::: warning引用必须被初始化。引用本身不是对象,所以不能定义引用引用。...一般的,应该尽量减少捕获的数据量,来避免潜在的问题。 如果可能,避免捕获指针或引用。 ::: 隐捕获: 当混合使用捕获和捕获时,捕获列表中的第一个元素必须是一个&或=。...捕获的变量必须使用与隐捕获不同的方式。 lambda捕获列表 P352 可变lambda: 若希望改变一个被捕获的变量的值,必须在参数列表首加上关键字mutable。...重载运算符包含返回类型、参数列表和函数体。 ::: tip 当一个重载的运算符是成员函数时,this绑定到左侧运算对象。成员运算符函数的参数数量比运算对象的数量少一个。...如果我们想拷贝(或移动)基类部分,则必须在派生类的构造函数初始值列表中使用基类的拷贝(或移动)构造函数。 ::: 派生类的赋值运算符: 派生类的赋值运算符必须的为其基类部分赋值。

1.7K20

两万字总结《C++ Primer》要点

::: 复合类型 定义:复合类型是基于其他类型定义的类型。 1.引用 引用:为对象起另外一个名字。 ::: warning引用必须被初始化。引用本身不是对象,所以不能定义引用引用。...一般的,应该尽量减少捕获的数据量,来避免潜在的问题。 如果可能,避免捕获指针或引用。 ::: 隐捕获: 当混合使用捕获和捕获时,捕获列表中的第一个元素必须是一个&或=。...捕获的变量必须使用与隐捕获不同的方式。 lambda捕获列表 P352 可变lambda: 若希望改变一个被捕获的变量的值,必须在参数列表首加上关键字mutable。...重载运算符包含返回类型、参数列表和函数体。 ::: tip 当一个重载的运算符是成员函数时,this绑定到左侧运算对象。成员运算符函数的参数数量比运算对象的数量少一个。...如果我们想拷贝(或移动)基类部分,则必须在派生类的构造函数初始值列表中使用基类的拷贝(或移动)构造函数。 ::: 派生类的赋值运算符: 派生类的赋值运算符必须的为其基类部分赋值。

1.5K30

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

重载运算符函数的参数数量与该运算符作用的运算对象数量一样多。比如 一元运算符有一个参数,二元运算符有两个参数。...关于 成员运算符函数的(参数数量比运算符的运算对象总数少一个 的原因是 第一个左侧运算对象绑定到隐的 this 指针上。...如果用户对运算符可能有几种不同的理解,则使用这样的运算符将产生二义性。...赋值和复合赋值运算符赋值运算符的行为与复合版本的类似 :赋值之后,左侧运算对象和右侧运算对象的值相等,并且运算符应该返回它左侧运算对象的一个引用。...复合赋值运算符一般来说应该是成员,但并非必须,这一点与赋值运算符不同。 ●改变对象状态的运算符或者与给定类型密切相关的运算符,如递增、递诚和解引用运算符,通常应该是成员。

18120

类和对象:运算符重载

当运行到使用重载运算符的时候就会进行调用重载函数: 赋值运算符重载 赋值运算符重载格式 参数类型:const T&,传递引用可以提高传参效率 返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值...**检测是否自己给自己赋值 返回*this **:要复合连续赋值的含义 //作为成员函数,赋值运算符重载函数: // 用Date类型引用返回使得可以连续赋值 Date& operator=(const...默认赋值运算符重载 用户没有实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。、(值拷贝/浅拷贝 类似Date )。...由于前置++和后置++的源代码原本是没区别的,所以为了区别这两个,祖师爷用一种机制来进行区分使用:后置++运算符重载时,需要声明一个额外的int类型的参数,这个参数在实际使用时并不需要由程序员传递,...,类似:`in >> d1 >> d2 >> d3;` ## 流输出 ( << ) 为了按照`out << d`的形式来进行使用重载运算符,所以用在类中用友元函数,这样既避免了this指针,还可以使该函数可以使用成员变量

8710
领券