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

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

只有当所有相关的转换都请求了同一个转换时标准隐式转换的优先级才会有效 如果调用重载时我们需要显式写出转换或用强制类型转换,则常常说明我们的设计有不足 类型转换中有一个转换比较特别,那就是bool类型的转换...将类往bool类型进行转换是最常见的一种做法,但是由于转到bool类型很可能表达的并不是简单的数据语义,所以C11加入了显式类型转换来限制它,方法是转换函数前加上explicit,这样编译器就不会隐式进行这个转换...,也就是我们必须使用强制类型转换才能使用 但是对于bool的特殊对待,一些条件表达,例如if,for,逻辑运算符和三目运算符,bool转换会自动进行显式转换 对类进行隐式类型转换最好尽量避免,因为语义常常比较模糊...,建议除了bool类型外不要进行隐式的类类型转换 和普通函数调用不同,我们不能通过调用的形式来区分当前调用的重载函数是成员函数还是非成员函数 当我们使用重载运算符时,编译器的候选函数集包括了同名的非成员函数和成员函数...,也就是当我们表达式中使用了目标是内置类型的类型转换时,需要考虑接下来要使用运算符到底是内置的还是我们自定义的运算符,这也很容易引起二义性问题

64010

C++:特殊类设计和四种类型转换

一、特殊类设计 1.1 不能被拷贝的类 拷贝只会放生在两个场景:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。...C++98: 1、将拷贝构造函数与赋值运算符重载只声明不定义。...析构函数设置成私有同样会导致对象无法栈上进行创建。因为自定义类型栈帧销毁的时候会去自动调用他的析构函数,但是因为调不到所以会报错。...1、隐式类型转换:编译器在编译阶段自动进行,能转就转,不能转就编译失败。相近类型才可以进行隐式类型转换 ,比如int和double 他们本质上都是表示数据的大小。...return 0; 缺陷:转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换 2.2 C++的类型转换 标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符

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

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

,这就容易导致二义性问题 如果调用重载时我们需要显式写出转换或用强制类型转换,则常常说明我们的设计有不足 类型转换中有一个转换比较特别,那就是bool类型的转换。...将类朝bool类型进行转换是最常见的一种做法,但C11加入了显式类型转换来限制它,编译器不会隐式进行这个转换,也就是我们必须使用强制类型转换才能使用。...但对于bool又有特殊对待,一些条件表达,例如if,for,逻辑运算符和三目运算符,bool转换会自动进行显式转换 15 面向对象程序设计 强调下两个术语: 覆盖(重写) override...因此除了重载虚函数外最好不要让名称同名 派生类可以覆盖基类重载的函数,但是如果派生类希望基类重载的几个函数都在派生类可见的话:一种方法是不覆盖任何一个重载函数或将所有重载函数都进行一次覆盖;另一种方法是为需要重载的函数名使用...的类来进行特殊的类型转换能够动态地将这些语言特性消去从传入的参数中提取出我们想要的类型 编译器是从模板函数的调用推断具体的实参类型的要求16.2有详细介绍 如果我们通过类型别名或模板参数之类的方法间接定义了引用的引用

1.7K10

C++特殊类设计+类型转换

请设计一个类,不能被拷贝 拷贝只会放生在两个场景:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。...C++98 将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有即可。 class CopyBan { // ......C语言中的类型转换 C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换...隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败 显式类型转化:需要用户自己处理 void Test () { int i = 1; // 隐式类型转换...,注意因为C++要兼容C语言,所以C++还可以使用C语言的转化风格。

1.2K30

特殊类设计以及C++的类型转换

请设计一个类,不能被拷贝 拷贝只会放生在两个场景:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。...C++98: 将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有即可。 class CopyBan { // ......隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败 显式类型转化:需要用户自己处理 请看代码: void Test() { int i = 1; // 隐式类型转换 double...注意: 强制类型转换关闭或挂起了正常的类型检查,每次使用强制类型转换前,程序员应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会...强烈建议:避免使用强制类型转换

6410

使用new运算符进行动态内存分配

动态内存由运算符new和delete控制将函数中局部(指针)变量的连接性声明为外部的extern,则文件位于该声明后面的所有函数都可以使用该局部(指针)变量,例子:extern float* p_fees...⽀持C++11。...最初的10年,C++在这种情况 下让new返回空指针,但现在将引发异常std::bad_alloc。...然⽽,它 们的类型不同,p1是double指针,⽽buffer是char指针(顺便说⼀句,这 也是程序使⽤(void *)对buffer进⾏强制转换的原因,如果不这样做, cout将显⽰⼀个字符串)同时...基本上,它只是返回传递给它的地址,并将其强制转换为void *,以便能够赋给任何指针类 型。但这说的是默认定位new函数,C++允许程序员重载定位new函数。

48420

C++补充知识&C++11及其特性

即可作为右值使用,也可以作为左值使用。 返回形参当引用 (注:C++链式编程,经常用到引用, 例如运输符重载) Array容器 详见-C++SLT容器。...除非所需转换本身是低级别的,否则应使用其他强制转换运算符之一。(低级别:在内存没啥差别) 与static_cast相加可替换掉C风格的类型转换。...类型转换使用建议 static_cast静态类型转换,编译的时c++编译器会做编译时的类型检查;隐式转换;基本类型转换,父子类之间合理转换 若不同类型之间,进行强制类型转换,用reinterpret_cast...建议: C语言中 能隐式类型转换的,c++可用 static_cast()进行类型转换。...因C++编译器在编译检查一般都能通过;C语言中不能隐式类型转换的,c++可以用 reinterpret_cast() 进行强制类型解释**。

37810

编写高质量代码改善C#程序的157个建议

1、使用类型的转换运算符,其实就是使用类型内部的一方方法(即函数)。...转换运算符分为两类:隐式转换和显式转换(强制转换)。基元类型普遍都提供了转换运算符。 所谓“基元类型”,是指编译器直接支持的数据类型。...///float到int必须存在一个显式转换 用户自定义的类型也可以通过重载转换运算符的方式提供这一类转换: public class Ip { IPAddress value...如果类型之间都上溯到了某个共同的基类,那么根据此基类进行转换(即基类转型为子类本身),应该使用as。子类与子类之间的转换,则应该提供转换操作符,以便进行强制转换。...因为当前这个版本进行了两次类型检测。但是,as操作符有个问题,就是它不能操作基元类型。如果涉及到基元类型的算法,那么就要使用is进行判断之后再进行转型的操作,以避免转型失败。 ?

53640

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

其中,捕获列表的参数就是构造函数的参数,且是这个未命名类的数据成员 ,并且 lambda对象创建时被初始化。而 lambda表达式的参数与函数调用运算符的参数对应。...int si + 3.14; // 内置类型转换将所得到的 int继续转换成 double 大多数情况下,自动发生的类型转换,可能会超出使用者的预期,增加使用难度...所以实践很少定义类型转换运算符,不过为了方便将表达式用作条件判读,定义向 bool的类型转换还是较为普遍。为了防止自动发生的类型转换,C++11新标准引入了显式的类型转换运算符。...显式转换必须通过显式的强制类型转换才可以使用,不过当用作条件判断时,编译器还是会自动执行显式的类型转换。...而如果使用命名的函数来调用时,成员函数和非成员函数不会彼此重载。如果我们对一个类既提供了转换目标是算术类型的类型转换,也提供了重载运算符,则将会遇到重载运算符与内置运算符的二义性问题。

87160

【笔记】《C++Primer》—— 第4章

然后C11的时候标准又引入了一个要后很多章才遇到的操作:使用&&来得到右值引用。...有关表达式求值的就是两点:不清楚组合优先级时一定要强制使用括号来指定优先级,一条表达式内不要对一个对象进行多次操作。...比较运算除非比较的对象是bool值否则绝对不要用bool值进行比较,因为bool会被转换为0和1 逻辑与&&的优先级高与逻辑或||。...数组会在大多数表达式中转换为指针除了sizeof,decltype之类的运算符 非常量类型的指针可以转换为常量指针,但是不能反反向隐式转换 cin的返回值是读入成功还是失败的bool值 强制类型转换...static_cast是最常用最基础的转换,我们平时使用强制类型转换都可以改成这个。它还可以将编译器无法自动执行的类型进行转换,例如将void*转为其他的指针类型。

60140

C++:27---new delete malloc free

,它调用的分别为赋值运算符重载operator new()和operator delete(); 实际上我在上一节已经讲了,一个是库函数,一个是运算符,怎么可能相同呢。...p2=new int[4]; delete []p2; } 由此可知: (1)malloc开辟空间类型大小需手动计算,new是由编译器自己计算; (2)malloc返回类型为void*,必须强制类型转换对应类型指针...,new则直接返回对应类型指针; (3)malloc开辟内存时返回内存地址要检查判空,因为若它可能开辟失败会返回NULL;new则不用判断,因为内存分配失败时,它会抛出异常bac_alloc,可以使用异常机制...,标准库里它有8个重载版本;而malloc/free不可以重载; 6.对于malloc分配内存后,若在使用过程内存分配不够或太多,这时可以使用realloc函数对其进行扩充或缩小,但是new分配好的内存不能这样被直观简单的改变...; 7.对于new/delete若内存分配失败,用户可以指定处理函数或重新制定分配器(new_handler(可以在此处进行扩展)),malloc/free用户是不可以处理的。

60530

【笔记】《C++Primer》—— 第19章:特殊工具与技术

19.1 控制内存分配 我平时有时候会说“重载new和delete”,但实际上重载这两个运算符重载其他的运算符大不相同,准确来说实际上我们并不能重载new和delete,这需要了解new和delete...当要转到指针时,目标必须是指针;要转到左值引用则必须是左值,要转到右值引用则必须不是左值 对目标是指针的类型转换失败是会返回0,当目标是引用失败时抛出bad_cast异常,这个异常在typeinfo头文件里...,所以可以使用dynamic_cast将不同的类型强制转换为相同的类型而不用担心出错,转换为相同的类型后剩下的部分就都是正常的equal比较了。...,将调用运算符转为指针调用 C11多了一种简单一些的方法是使用标准库功能mem_fn来让编译器自己去推断成员的类型,也就是需要传入可调用对象的地方改写为mem_fn(&Screen::testFunction...bitCount就是其包含的二进制位数 连续定义的位域会被编译器压缩在一个整数的相邻位,但是如何压缩是机器相关的 位域通常是使用运算符来操作的 程序可能有一些变量并不由程序自身控制,例如与时钟相关的变量

81840

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

保护都可以 友元函数:同上 全局函数:只能访问公有的 三、运算符重载的规则 C++98,C++0x,C++11对“哪些运算符重载能够重载”有一致的规定。...:(三目运算符),#(预处理运算符) 只能用成员函数重载运算符:=(赋值运算符)、()(强制类型转换)、[]、new、delete、-> 只能用友元、全局函数重载运算符:> +=...=运算符重载 用途:这两个运算符用来判断两个类对象数据成员的值是否相等/不相等(可以重载判断单/多个成员是否相等) 设计规则: 通常情况下,==运算符应该具有传递性,例如:如果a==b和b==c...使用常量是因为不会改变对象的内容) 返回值:返回它的ostream形参 重载输入运算符>> 参数: 参数1:是运算符将要读取的流的引用 参数2:将要读入到的(非常量)的引用(使用非常量是因为输入运算符本身的目的就是将数据读入到这个对象...如果类重载了函数调用运算符,那么我们使用该对象时就如同调用一个函数一样 注意:()运算符与对象初始化时调用构造函数不是一个东西、因此()函数调用运算符不能再类初始化时使用,会与构造函数冲突 struct

58030

C++之运算符重载

大家好,又见面了,我是全栈君   C++预定义运算符的操作对象只限于基本的内置数据类型,但是对于我们自定义的类型(类)是没有办法操作的,但是大多时候我们需要对我们定义的类型进行类似的运算,这个时候就需要我们对运算符进行重新定义...  (2)使用运算符不能违反运算符原来的句法规则   (3)不能修改运算符原来的优先级   (4)不能创建一个新的运算符   (5)不能进行重载运算符:成员运算符,作用域运算符,条件运算符,sizeof...运算符,const_cast、dynamic_cast、reinterpret_cast、static_cast强制类型转换运算符   (6)大多数运算符可以通过成员函数和非成员函数进行重载但是下面这四种运算符只能通过成员函数进行重载...自动类型转换   C和C++,如果编译器看到一个表达式或函数使用了一个不合适的类型,它经常会执行自动类型转换C++,可以通过定义自动类型转换函数来为用户定义类型达到相同效果。...使用自动类型转换的过程特别需要注意隐藏的缺陷和问题。

49010

C++ 运算符重载

但是在对运算符进行重载时,好的风格是应该尽量保留运算符原本的特性,这样其他人在使用这个运算符时才不容易产生困惑。赋值运算符是可以连用的,这个特性重载后也应该保持。...7 C++重载()(强制类型转换运算符)  C++ ,类型的名字(包括类的名字)本身也是一种运算符,即类型强制转换运算符。...类型强制转换运算符是单目运算符,也可以被重载,但只能重载为成员函数,不能重载为全局函数。...经过适当重载后,(类型名)对象这个对对象进行强制类型转换的表达式就等价于对象.operator 类型名(),即变成对运算符函数的调用。 下面的程序对 double 类型强制转换运算符进行重载。 ...>是 iostream 中被重载,才成为所谓的“流插入运算符”和“流提取运算符”的。 类型的名字可以作为强制类型转换运算符,也可以被重载为类的成员函数。它能使得对象被自动转换为某种类型。

1.2K00

C++ 运算符重载

但是在对运算符进行重载时,好的风格是应该尽量保留运算符原本的特性,这样其他人在使用这个运算符时才不容易产生困惑。赋值运算符是可以连用的,这个特性重载后也应该保持。...7 C++重载()(强制类型转换运算符)  C++ ,类型的名字(包括类的名字)本身也是一种运算符,即类型强制转换运算符。...类型强制转换运算符是单目运算符,也可以被重载,但只能重载为成员函数,不能重载为全局函数。...经过适当重载后,(类型名)对象这个对对象进行强制类型转换的表达式就等价于对象.operator 类型名(),即变成对运算符函数的调用。 下面的程序对 double 类型强制转换运算符进行重载。 ...>是 iostream 中被重载,才成为所谓的“流插入运算符”和“流提取运算符”的。 类型的名字可以作为强制类型转换运算符,也可以被重载为类的成员函数。它能使得对象被自动转换为某种类型。

1.1K20

C++ 炼气期之算术运算符

如果出现类型不一致时,编译器会试着把不同类型的数据转换成同类型的数据后再进行运算。开发者也可以显示进行强制类型转换。 2. 运算符种类 C++运算符非常多,如下是几类常用的运算符: 算术运算符。...Tip: 只有当两个运算符作用于同一个操作数时,优先级和结合性才有意义。 C++的基础运算符较多,且因C++是弱类型语言,每一种运算符使用过程中都存在很多细节问题。...算术运算符是二元运算符使用时,需要提供 2 个操作数。 3.2 运算符重载问题 C++可以重载运算符,所谓重载运算符,指同一个运算符可以根据使用时的上下文信息,表现出不同的运算能力。...3.6 类型转换 根据运算符的基本使用原则,要求所有操作数的类型必须相同。 有时,一个表达式,即使存在多个操作数的类型不一致,也能正常工作。...强制类型转换不会修改变量本身,而是创建一个新的值。用于表达式中进行计算。

52930

真没想到nullptr和NULL得区别,大了去了

// 构造函数重载决议期间,只要有任何可能,大括号初始化物就会与带有std: : initializer_ list 型别的形参相匹配,即使其他重载版本有着貌似更 加匹配的形参表 。...// 模板内容进行对象创这时,到底应该使用小括号还是大括号会成为一个 棘手问题。...Status里增加一个 audited =500, 则需要重新进行编译 //改进:C++11为枚举型别提供的前置声明能力可以破除重新编译的麻烦 //前置声明 enum class Status; /.../取用前置声明的枚举型别 void continueProcessing(status s); //即使Staus被修改了,也无需重新编译 //说到这里,为什么C++11的枚举型别可以进行前置声明,... delete将复制构造函数和复制赋值运算符标识为删除函数 //C++11 delete将复制构造函数和复制赋值运算符标识为删除函数 template<class charT,class traits

1.7K30

Java基础知识2-Java基本语法

变量:程序执行过程某个范围内其值发生改变的量。 常量:执行过程其值不发生改变,分为字面值常量和自定义常量,如3.14。 表达式:Java中使用的是中缀表达式。...若强行将计算的赋值表达式与变量运算,则会发生编译失败。如 强制转换:目标类型 变量名 = (目标类型)(被转换的数据);转换成二进制进行考虑。...比如要打印 byte a = 130,可以利用强制转换来实现。...B:扩展的赋值运算符的特点              隐含了自动强制转换。             ...这种方式产生的结果是静态方法改变一个参数变量的值对调用者没有影响。 方法名可以被重载: 所谓重载,指的是同一个类,允许存在一个以上的同名方法,只要它们的参数个数、参数类型,参数顺序不同。

17440

只有你能 new 出来!.NET 隐藏构造函数的 n 种方法(Builder Pattern 构造器模式)

我们可能会使用工厂或者某些其他的方法让开发者不知道具体类型的时候获取到抽象类型的实例。 这正是构造器模式的典型应用场景。...维基百科对它适用性的描述为: 以下情况使用生成器模式: 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时; 当构造过程必须允许被构造的对象有不同的表示时。...▲ 不能定义从接口进行的隐式转换 运算符重载 使用运算符重载,也可以让类型实例的构造隐藏起来。...ERMail/Scope.cs 关于运算符重载的更多内容,可以参考我的另外两篇文章: C# 那些可以被重载的操作符,以及使用它们的那些丧心病狂的语法糖 - walterlv C# 空合并操作符(??)...本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。

59500
领券