电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

c 的 算符 重载

11页
  • 卖家[上传人]:小**
  • 文档编号:89123256
  • 上传时间:2019-05-18
  • 文档格式:DOC
  • 文档大小:28KB
  • / 11 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、C 的算符重载算符重载的作用是什么?它允许你为类的用户提供一个直觉的接口。算符重载允许C/C+的运算符在用户定义类型(类)上拥有一个用户定义的意义。重载的算符是函数调用的语法修饰:classFredpublic:/.;#if0/没有算符重载:Fredadd(Fred,Fred);Fredmul(Fred,Fred);Fredf(Freda,Fredb,Fredc)returnadd(add(mul(a,b),mul(b,c),mul(c,a);/哈哈,多可笑.#else/有算符重载:Fredoperator+(Fred,Fred);Fredoperator*(Fred,Fred);Fredf(Freda,Fredb,Fredc)returna*b+b*c+c*a;#endif算符重载的好处是什么?通过重载类上的标准算符,你可以发掘类的用户的直觉。使得用户程序所用的语言是面向问题的,而不是面向机器的。最终目标是降低学习曲线并减少错误率。有什么算符重载的实例?这里有一些算符重载的实例:myString+yourString可以连接两个std:string对象myDate+可以增加一个Dat

      2、e对象a*b可以将两个Number对象相乘ai可以访问Array对象的某个元素x=*p可以反引用一个实际指向一个磁盘记录的smartpointer-它实际上在磁盘上定位到p所指向的记录并返回给x。但是算符重载使得我的类很丑陋;难道它不是应该使我的类更清晰吗?算符重载使得类的用户的工作更简易,而不是为类的开发者服务的!考虑一下如下的例子:classArraypublic:int&operator(unsignedi);inlineint&Array:perator(unsignedi)/.有些人不喜欢operator关键字或类体内的有些古怪的语法。但是算符重载语法不是被期望用来使得类的开发者的工作更简易。它被期望用来使得类的用户的工作更简易:intmain()Arraya;a3=4;/用户代码应该明显而且易懂.记住:在一个面向重用的世界中,使用你的类的人有很多,而建造它的人只有一个(你自己);因此你做任何事都应该照顾多数而不是少数。什么算符能/不能被重载?大多数都可以被重载。C的算符中只有.和?:(以及sizeof,技术上可以看作一个算符)。C+增加了一些自己的算符,除了:和.*,大多数

      3、都可以被重载。这是一个下标算符的示例(它返回一个引用)。先没有算符重载:classArraypublic:int&elem(unsignedi)if(i99)error();returndatai;private:intdata100;intmain()Arraya;a.elem(10)=42;a.elem(12)+=a.elem(13);现在用算符重载给出同样的逻辑:classArraypublic:int&operator(unsignedi)if(i99)error();returndatai;private:intdata100;intmain()Arraya;a10=42;a12+=a13;我能重载operator=以便比较两个char来进行字符串比较吗?不行:被重载的算符,至少一个操作数必须是用户定义类型(大多数时候是类)。但即使C+允许,也不要这样做。因为在此处你应该使用类似std:string的类而不是字符数组,因为数组是有害的。因此无论如何你都不会想那样做的。我能为幂运算创建一个operator*吗?不行。运算符的名称、优先级、结合性以及元数都是由语言固定的。在C+中

      4、没有operator*,因此你不能为类类型创建它。如果还有疑问,考虑一下x*y与x*(*y)等同(换句话说,编译器假定y是一个指针)。此外,算符重载只不过是函数调用的语法修饰。虽然这种特殊的语法修饰非常美妙,但它没有增加任何本质的东西。我建议你重载pow(base,exponent)(双精度版本在中)。顺便提一下,operator可以成为幂运算,只是优先级和结合性是错误的。如何为Matrix(矩阵)类创建下标运算符?Recentlychangedsoitusesnew-styleheadersandthestd:syntax(on7/00).ClickheretogotothenextFAQinthechainofrecentchanges.用operator()而不是operator。当有多个下标时,最清晰的方式是使用operator()而不是operator。原因是operator总是带一个参数,而operator()可以带任何数目的参数(在矩形的矩阵情况下,需要两个参数)。如:classMatrixpublic:Matrix(unsignedrows,unsignedcols);

      5、double&operator()(unsignedrow,unsignedcol);doubleoperator()(unsignedrow,unsignedcol)const;/.Matrix();/析构函数Matrix(constMatrix&m);/拷贝构造函数Matrix&operator=(constMatrix&m);/赋值算符/.private:unsignedrows_,cols_;double*data_;inlineMatrix:Matrix(unsignedrows,unsignedcols):rows_(rows),cols_(cols),data_(newdoublerows*cols)if(rows=0|cols=0)throwBadIndex(Matrixconstructorhas0size);inlineMatrix:Matrix()deletedata_;inlinedouble&Matrix:perator()(unsignedrow,unsignedcol)if(row=rows_|col=cols_)throwBadIndex(Matrixs

      6、ubscriptoutofbounds);returndata_cols_*row+col;inlinedoubleMatrix:perator()(unsignedrow,unsignedcol)constif(row=rows_|col=cols_)throwBadIndex(constMatrixsubscriptoutofbounds);returndata_cols_*row+col;然后,你可以使用m(i,j)来访问Matrixm的元素,而不是mij:intmain()Matrixm(10,10);m(5,8)=106.15;std:coutm(5,8);/.为什么Matrix(矩阵)类的接口不应该象数组的数组?本FAQ其实是关于:某些人建立的Matrix类,带有一个返回Array对象的引用的operator。而该Array对象也带有一个operator,它返回Matrix的一个元素(例如,一个double的引用)。因此,他们使用类似mij的语法来访问矩阵的元素,而不是象m(i,j)的语法。数组的数组方案显然可以工作,但相对于operator()方法来说,缺乏灵活性。尤其是

      7、,用方法很难表现的时候,用operator()方法可以很简单的完成,因此方法很可能导致差劲的表现,至少某些情况细是这样的。例如,实现方法的最简单途径就是使用作为密集矩阵的,以以行为主的形式保存(或以列为主,我记不清了)的物理布局。相反,operator()方法完全隐藏了矩阵的物理布局,在这种情况下,它可能带来更好的表现。可以这么认为:operator()方法永远不比方法差,有时更好。operator()永远不差,是因为用operator()方法实现以行为主的密集矩阵的物理布局非常容易。因此,当从性能观点出发,那样的结构正好是最佳布局时,operator()方法也和方法一样简单(也许operator()方法更容易一点点,但我不想夸大其词)。operator()方法有时更好,是因为当对于给定的应用,有其它比以行为主的密集矩阵更好的布局时,用operator()方法比方法实现会容易得多。作为一个物理布局使得实现困难的例子,最近的项目发生在以列访问矩阵元素(也就是,算法访问一列中的所有元素,然后是另一列等),如果物理布局是以行为主的,对矩阵的访问可能会cache失效。例如,如果行的大小几乎和处

      8、理器的cache大小相当,那么对每个元素的访问,都会发生cache不命中。在这个特殊的项目中,我们通过将映射从逻辑布局(行,列)变为物理布局(列,行),性能得到了20%的提升。当然,还有很多这类事情的例子,而稀疏矩阵在这个问题中则是又一类例子。通常,使用operator()方法实现一个稀疏矩阵或交换行/列顺序更容易,operator()方法不会损失什么,而可能获得一些东西-它不会更差,却可能更好。使用operator()方法。该从外(接口优先)还是从内(数据优先)设计类?从外部!良好的接口提供了一个简化的,以用户词汇表达的视图。在面向对象软件的情况下,接口通常是单个类或一组紧密结合的类的public方法的集合.首先考虑对象的逻辑特征是什么,而不是打算如何创建它。例如,假设要创建一个Stack(栈)类,其包含一个LinkedList:classStackpublic:/.private:LinkedListlist_;Stack是否应该有一个返回LinkedList的get()方法?或者一个带有LinkedList的set()方法?或者一个带有LinkedList的构造函数?显然,答案是

      9、不,因为应该从外向里设计接口。也就是说,Stack对象的用户并不关心LinkedList;他们只关心pushing和popping。现在看另一个更微妙的例子。假设LinkedList类使用Node对象的链表来创建,每一个Node对象有一个指向下一个Node的指针:classNode/*.*/;classLinkedListpublic:/.private:Node*first_;LinkedList类是否应该有一个让用户访问第一个Node的get()方法?Node对象是否应该有一个让用户访问链中下一个Node的get()方法?换句话说,从外部看,LinkedList应该是什么样的?LinkedList是否实际上就是一个Node对象的链?或者这些只是实现的细节?如果只是实现的细节,LinkedList将如何让用户在某时刻访问LinkedList中的每一个元素?某人的回答:LinkedList不是的Node链。它可能的确是用Node创建的,但这不是本质。它的本质是元素的序列。因此,LinkedList象应该提供一个LinkedListIterator,并且LinkedListIterator应该有一个operator+来访问下一个元素,并且有一对get()/set()来访问存储于Node的值(Node元素中的值只由LinkedList用户负责

      《c 的 算符 重载》由会员小**分享,可在线阅读,更多相关《c 的 算符 重载》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2 2022年小学体育教师学期工作总结 2022年家长会心得体会集合15篇
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.