Effective C++读书笔记之若所有参数皆需类型转换,请为此采用non-member函数

《Effective C++》 读书笔记(详细总结55条款)上篇 下面从四个方面来说 (1) C++ 以 C 为基础,很多语句语法都没有改变,只是进行了扩展,C++ 解决问题的时候,可以理解为 C 的高效解法 (2) 面向对象,有构造函数,析构函数,继承、封装、多态、虚函数动态绑定,这是不同于C 语言的部分 (3) 泛型编程、可以理解为代码的模型,但是代码本身并不占用内存空间,只有在实例化的时候,才分配内存,所以可以提高代码复用性 阅读详情

举个例子来说明我们这次要面对的问题:
 设计一个class用来表现有理数,它应该支持隐式类型转换,虽然我们说令classws支持隐式类型转换通常是个不好的主意。这是为了我们设计的类可以和内置类型进行运算。例如和整型。
 class Rational {
 pbulic:
  Rational(int numerator = 0, int denominator = 1); //注意这个构造函数不为explicit
  int numerator() const;
  int denominator() const;   //两个接口 提供对成员的访问
 priavte:
  .... 
 };
 现在我们想这个class可以支持运算如加法等。问题就来了,这个operator*函数声明为member函数好呢,还是声明为non-member函数好呢?我们通过分别分析这两个函数来给出答案。
 1) member函数实现
 class Rational {
 public:
  .....
  const Rational operator* (const Rational& rhs) const;
 };
 这个设计可以使你能够将两个有理数以最自在的方式相乘,例如:
 Rational oneEighth(1,8);
 Rational oneHalf(1,2);
 Rational result = oneHalf * oneEighth;   //这样的调用很好
 可是当我们希望一个有理数和一个int的数相乘时出现了问题,
 result = oneHalf * 2;    //很好
 result = 2 * oneHalf;    //错误
 写成函数形式就可以看到问题:
 result = oneHalf.operator*(2);  //成功
 result = 2.operator*(ontHalf);  //错误
 operator*函数在int中没有上面class中定义形式,所以不能通过编译。这时编译器也会尝试寻找non-member operator*函数。可是本例没有声明这样的函数,所以查找失败。
 为什么第一个可以成功呢?2也不是一个Rational类型的对象。这是因为编译器为这个2进行了隐式类型转换。
 为什么第一个可以发生隐式类型转换,第二个调用不可以呢?这是因为第一个调用2是作为参数,而第二个不是。
 结论是,只有当参数被列于参数列内,这个参数才是隐式类型转换的合格参与者。也就是说它才可以发生隐式类型转换。
 可是作为member函数只能接收一个参数,而我们这里需要两个参数都需要能发生隐式类型转换。所以唯一的办法就是使用non-member函数。
 1) non-member函数实现
 class Rational { ... };
 const Rational operator* (const Rational& lhs, const Rational& rhs) //一个non-member函数
 {
  return Rational(lhs.numerator() * rhs.numerator(),
   lhs.denominator()* rhs.denominator());
 }
 result = oneHalf * 2;    //很好
 result = 2 * oneHalf;    //没问题了 通过编译
 这时还有一个问题,是不是该把这个函数声明为friend函数?
 答案是否定的。请记住无论何时如果你可以避免friend函数就该避免,因为就像真实世界一样,朋友带来的麻烦往往多过其价值。
 总结:
 如果你需要为某个函数的所有参数(包括被this指针所指的那个隐喻参数)进行类型转换,那么这个函数必须是个non-member. 

【绝版C++书籍】《Effective STL》读书笔记 《Effective STL》读书笔记写在前面《Effective STL》中可能过时的内容1 容器第1条:慎重选择容器类型。第2条:不要试图编写独立于容器类型的代码。第3条:确保容器中的对象拷贝正确而高效。第4条:调用empty而不是检查size()是否为0。第5条:区间成员函数优先于与之对应的单元素成员函数。第6条:当心C++编译器最烦人的分析机制。第7条:如果入容器中包含了通过new操作创建的指针,切记在容器对象析构前将delete掉。第8条:切勿创建包含auto_ptr的容器对象。第9条:慎重选择删 阅读详情

相关推荐

《Effective C++》读书笔记——第一章:Accustoming Yourself to C++

大年三十却不能回家,也不能找????玩,我恨死这个新型冠状病毒了 既然只能宅在家,那就充分利用一下这段时间多学习一点吧 言归正传,本章主要是在讲如何让自己适应C++,当然这也是全书所想要表达的,只是这一章着重讲一些基础 Item 1: VIEW C++ AS A FEDERATION OF LANGUAGES 特意去查了一下federation是什么意思,好像大概是说联盟、联邦之类的,所以这条item...

Luminous 1558

读书笔记《Effective C++》条款24:若所有参数皆需类型转换,请为此采用non-member函数

要点:

Do-Program的专栏 464

5分钟搞定Conflux钱包注册:Fluent钱包从安装到转账全流程指南

本文提供Conflux公链上Fluent钱包的完整注册和使用指南,涵盖从安装、助记词备份到CFX转账的全流程。特别强调安全操作要点,包括助记词保管和网络选择,帮助用户5分钟内快速掌握这款国产公链钱包的核心功能,确保数字资产安全。

weixin_29181861的博客 244

Effective C++ 读书笔记 Item24 若所有参数皆需类型转换,请为此采用(non-member )非成员函数

虽然Item 15:资源管理类需要提供对原始资源的访问中提到,最好不要提供隐式的类型转化。 但这条规则也存在特例,比如当我们需要创建数字类型的类时。正如double和int能够自由地隐式转换一样, 我们的数字类型也希望能够做到这样方便的接口。 当然这一节讨论的问题不是是否应当提供隐式转换,而是如果运算符的所有“元”都需要隐式转换时,请重载该运算符为友元函数。 通过运算符重载来扩展用户定义类型时,...

Vermont_的博客 254

QTest 单元测试框架及单元测试思考

qt 单元测试框架 QTEST 及思考

一个老菜鸟的学习分享 1万+

基于多智能体架构的AI自动化渗透测试平台PentAGI部署与实战

自动化渗透测试是网络安全领域提升效率、应对复杂威胁的关键技术。其核心原理在于通过程序化脚本或智能系统模拟攻击者行为,对目标系统进行安全评估。该技术能显著降低人工重复劳动,实现7x24小时持续监控与测试,其价值在于将安全专家从繁琐的扫描、信息收集中解放出来,专注于高级威胁分析与策略制定。在实际应用中,自动化渗透测试广泛应用于企业安全自评估、红蓝对抗演练及DevSecOps流程。本文聚焦于一个名为PentAGI的先进平台,它采用多智能体(Multi-Agent)系统架构,集成了知识图谱和向量数据库,实现了从侦察

weixin_30294295的博客 606

读书笔记_Effective_C++_条款二十四: 若所有参数皆需类型转换,请为此采用non-member函数...

还是举书上的有理数例子: 1 class Rational 2 { 3 private: 4 int numerator; 5 int denominator; 6 public: 7 Rational(int n = 0, int d = 1): numerator(n), denominator(d){assert(denominator...

weixin_30802273的博客 167

3D slicer查看形变场

3Dslice显示数据和形变场 将需要可视化的数据也导入3Dslice,注意描述为volume(图1a),如果没有显示是因为路径中不能有中文,也就是moving图像。 (b) 图1、数据导入形变场和 将相应的形变场数据直接拖入3Dslice,并修改描述为形变场(图1b)。 点击transform菜单图2(a),然后勾选形变场可视化图2(b)。 (b) 图2...

fanre的专栏 1947

读书笔记_Effective C++_习惯C++

这是一本非常经典C++书籍,也是我在工作中发现自己C++上还有很多薄弱点的时候经常拿来充电的。这本书内容很多,讲了很多如何高效地使用C++的方法,有些地方自己也没能啃透,读过一遍后很多知识点容易忘记,这次是一条一条地进行温习,之所以会分享出来是觉得对于程序员来说,好记性不如烂笔头,自己多动手往往在真正写程序的时候能够像条件反射一样写出好的代码。慢工出细活,对待技术要有谨慎和敬畏之心。这本书推荐喜欢C

John_cdy的专栏 3194

修改注册表导致开机时电脑显示“无法登陆到你的账户”的问题解决方案

1.问题描述:开机电脑显示“无法登陆到你的账户:通常可以通过从你的账户注销,然后重新登陆来解决问题,如果不立即注销,你创建的任何文件或进行的任何更改都将会丢失。” 2.问题原因:想要修改cmd中的用户名(红色部分),修改了注册表,重启时出现问题。 3.问题解决: win+R输入cmd,确定进入注册表界面,将下面的地址复制进地址栏(你也可以自己按目录查找),双击ProfileImage...

qq_33835957的博客 7万+

Windows 10 下 DockerToolbox 安装全攻略:从下载到配置阿里云镜像加速

本文详细介绍了在Windows 10系统上安装和配置DockerToolbox的完整流程。从下载安装包、执行初步安装,到关键步骤——修改虚拟机存储路径以及配置阿里云镜像加速器,旨在帮助开发者,尤其是初次接触Docker的新手,快速搭建高效的本地容器开发环境,并解决国内镜像下载缓慢的痛点。

moon9的博客 476

Effective cpp 读书笔记5

设计与声明(下) 22.将成员变量声明为private 23.宁以non-member、non-friend替换member函数 24.若所有参数皆需类型转换,请为此采用non-member函数 25.考虑写出一个不抛出异常的swap函数

GZGlenn的博客 417

93.华为路由器:IPSec加密GRE通道(GRE over IPsec)

IPSec加密GRE通道 由于GRE隧道不提供安全性保障,使用ipsec加密gre隧道是现网中比较常用的VPN部署,它的加密方式分为两种: 可以使用IPsec来加密隧道进行传输,叫做IPsec over GRE; 加密数据流后从隧道传输,称为GRE over IPsec。 下面将配置一个简单的IPsec over GRE实验。 一、搭建模拟环境 首先我们先搭建环境,先根据拓扑图把基本的IP地址配好,然后分别在AR1、AR3加两条静态路由,使得两个公网互通。 [AR1]in g0/0/0 [AR

迷逝 1万+

Effective C++_读书笔记

设计与声明。

Mr.Andy的博客 1460

MDF和DHF、DMR、DHR三者差异?注册与备案文件?医疗器械产品技术要求编写指导原则

定义:设计历史文档(DHF ) 指的是描述某医疗器械成品设计过程的有关记录。内容:DHF包括设计开发活动的所有记录。从最初的策划、客户需求、设计输入,设计输出、设计验证、设计确认、所有的设计评审,设计转换,以及设计变更相关的所有记录。均属于DHF的一部分。要求:各制造商应为每个类型的器械建立并保持设计历史文件。设计历史文件应包含或引用必要的记录,以证实设计符合经批准的设计计划和法规的要求。

学海无涯的专栏 9110

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

读书笔记《Effective c++》 条款24 若所有参数皆需要类型转换,请为此采用non-member函数

这节的例子很简单,就是类外定义操作符重载,一个二元操作符,对于本身出现在操作符的右边的表达式,是需要定义一个两个参数的non-member重载的,这个和是否是需要类型转换并没有绝对的关系,我还是没有get到本小节的点。 结论:   如果你需要为某个函数的所有参数(包括被this指针所指的那个隐喻参数)进行类型转换,那么这个函数必须是个non-member。

木头刀 341

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Effective C++ | 读书笔记 (一)

这意味着,如果你在一个编译单元中依赖于另一个编译单元中的全局静态对象的初始化结果,你的程序可能会遇到未定义行为,因为那些对象的初始化次序是不确定的。在构造、析构函数中一定只会调用本类中的虚函数。原因:当基类指针(引用)指向子类对象时,如果析构对象通过delete 指针的方式,只会调用基类的析构函数,不会调用子类的析构函数。如果把这个当做是基类,会有问题,析构函数只有声明没有定义,析构函数从派生类到基类的调用时,会发生链接错误。时,先调用基类的构造函数,此时派生类还没有被构造出来,所以调用的是基类的虚函数。

m0_74795952的博客 1042

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

《Effective C++》读书笔记

Effective C++Scott Meyers 屋檐下的水滴--读书笔记系列http://blog.youkuaiyun.com/dwater 导读 Introduction1.   所谓declaration,是用来将一个object、function、class或template的类型告诉编译器,它不带细节信息。所谓definition,是用来将细节信息提供给编译器。对

DWATER 3167

Effective C++ | 读书笔记 (三)

提前定义变量,有可能导致变量并没有使用(如中间抛异常了),而平白多了一个构造和析构成本。但是循环怎么办?// 方式AWidget w;i < n;...// 方式Bi < n;++i) {...做法A:1个构造 + 1个析构 + n个赋值操作做法B:n个构造函数 + n个析构函数打破本条款选择A的依据:(1)你知道赋值成本比“构造+析构"成本低。(2)你正在处理代码中效率高度敏感的部分。否则你应该使用做法B,维持变量尽可能在使用时定义的原则。请记住。

m0_74795952的博客 945

Effective C++ | 读书笔记 (四)

对应条款24,这里只是模版实现。规则一致,但它们写法上有所区别了。public:...// 需要隐式转换的接口定义为非成员函数{...};// 使用// 这里会编译错误,2不能隐式转换上面只是把24条款示例改为模版实现,然而模版版本是编译不过的,因为编译器并不知道2要转换为什么。编译器推断不了模版的隐式转换。对于模版我们只能通过friend和inline特性来实现非成员函数的定义。public:...// 这里Rational是Rational<T>的简写形式,在类模版内部可以简写。

m0_74795952的博客 1104

Effective C++读书笔记

 记得前段时间又一次拿起《Effective C++》的时候,有种豁然开朗的感觉,所以翻出了我第一遍读时做的笔记。只做参考以及查阅之用。如有需要请参阅《Effective C++》书本。 by shenzi/2010.5.17一.让自己习惯C++   条款01:视C++为一个语言联邦    为了更好的理解C++,我们将C++分解为四个主要次语言:C。说到底C++仍是以C

shenzi的天空 2万+

Effective C++ 读书笔记7

条款23:宁以non-member,non-friend替换member函数 请记住:宁可拿non-member non-friend函数替换member函数,这样做可以增加封装性,包裹弹性和机能扩展性 条款24:若所有参数皆需类型转换,请为此采用non-member函数 请记住:如果你需要为某个函数的所有参数(包括this指针所指的那个隐喻参数)进行类型转换,那么这个函数必

liyongOFDM的专栏 745

effective C++ 读书笔记

effective C++ 读书笔记 听说这是一本好书,于是就读了,确实不错。十年以后我再读这本书,应该会有更深的体会。

weixin_58414907的博客 475

Effective C++读书笔记——item24(非成员函数的用途)

函数可以使编译器自动对所有参数进行类型转换,提高代码的灵活性和一致性。当一个函数的所有参数都需要进行类型转换才能正常调用时,将该函数定义为。的成员函数,编译器不会自动对参数进行隐式类型转换,会导致编译错误。函数,编译器会对所有参数尝试隐式类型转换,使得代码可以正常运行。的对象,编译器会为它进行隐式类型转换。会导致编译错误,因为编译器不会自动对。的构造函数允许将整数转换为。类型(例如单位矩阵),那么。

weixin_46032775的博客 890

《Effective C++》读书笔记之item46:需要类型转换时请为模板定义非成员函数

1.在类外定义的模板函数,在实参具现化时不进行隐式类型转换:可以在函数调用过程中进行这样的转换,但是在能够调用一个函数之前,编译器必须知道那个函数存在,而为了知道它,必须先为相关的函数模板具现化参数类型。这是template C++与面向对象的C++不同的地方。 对条款24中的例子进行模板化: template class Rational{ public: Rational(con

banguijun的专栏 1214
上一篇: Effective C++读书笔记之宁以non-member、non-friend替换member函数
下一篇: Effective C++读书笔记之考虑写出一个不抛异常的swap函数
anthit
博客等级 码龄21年 13粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值