1.C++操作符重载形式—成员函数or友元函数

  • 1.对运算符重载,需要坚持四项基本原则:

    • 不可臆造运算符;
    • 运算符原有操作数的个数、优先级和结合性不能改变;
    • 操作数中至少一个是自定义类型;
    • 保持重载运算符的自然含义。
  • 一般来说,C++运算符重载可采用成员函数和友元函数,二者都可以访问类的私有成员,那么该采用哪一种呢?首先看一下二者的区别。
    • 当重载为成员函数时,会隐含一个this指针;当重载为友元函数时,不存在隐含的this指针,需要在参数列表中显示地添加操作数
    • 当重载为成员函数时,只允许右参数的隐式转换;当重载为友元函数时,能够接受左参数和右参数的隐式转换
  • 如下代码:
        class String{public:String(char *str);private:char *ptr;};
    
  • 因为String的构造函数参数为一个char*,所以如果采用友元形式的friend String operator+(const String &A, const String &B),那么char+String和String+char都能正常工作;而如果采用成员函数形式String::operator+(const String &A),则只能接受String+char,如果执行char+String则会编译出错。我们往往习惯String+char和char+String都应该被接受。需要注意的是,隐式转换由于临时变量的增加往往效率不高。如果应用程序对效率要求较高,针对以上类,建议选择定义多个运算符的友元重载版本:
        String & operator+(const String &A, const String &B);String & operator+(const char *str, const String &B);String & operator+(const String &A, const char *str);
    
  • **一般而言,对于双目运算符,最好将其重载为友元函数;而对于单目运算符,则最好重载为成员函数。**但是也存在例外情况。有些双目运算符是不能重载为友元函数的,比如赋值运算符=、函数调用运算符()、下标运算符[]、指针运算符->等,因为这些运算符在语义上与this都有太多的关联。比如=表示“将自身赋值为…”,[]表示“自己的第几个元素”,如果将其重载为友元函数,则会出现语义上的不一致。**还有一个需要特别说明的就是输出运算符<<。因为<<的第一个操作数一定是ostream类型,所以<<只能重载为友元函数,**如下:
        friend ostream & operator <<(ostream &os, const Complex &c);ostream& operator <<(ostream &os, const Complex &c){os << c.m_Real << “+” << c.m_Imag << “i” << endl;return os;}
    

2.参考博客

  • 博客链接

C++运算符重载形式--成员函数or友元函数?相关推荐

  1. C++运算符重载函数作为类成员函数和友元函数

    C++运算符重载函数作为类成员函数 1.1成员函数的重载运算符左侧是一个类对象,而且与运算符函数类型相同. 因为必须通过类的对象去调用该类的成员函数,而且只有运算符重载函数和返回值类型相同,运算结果才 ...

  2. C++运算符重载(成员函数方式)

    一.运算符重载 C++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作.如果将C++中这些现存的运算符直接作用于用户自定义的类型数据上,会得到什么样 ...

  3. C++运算符重载函数作为友元函数

    运算符重载函数作为友元函数 在前面的程序例子中对运算符"+"进行了重载,使之能用于两个字符串的相加.在该例中运算符重载函数 operator +(); 作为 my_string类中 ...

  4. (P22)运算符重载:运算符重载 ,成员函数重载 ,非成员函数重载 ,运算符重载规则

    文章目录 1.运算符重载 2.成员函数重载 3.非成员函数重载 4.运算符重载规则 1.运算符重载 运算符重载允许把标准运算符(如+.-.*./.<.>等)应用于自定义数据类型的对象 直观 ...

  5. C++之常引用对象只能调用常成员函数、重载为成员函数和友元函数的区别

    近日写了一道题,遇到了新bug,使博主对C++的逻辑严密性有了更深的体会,特写此博客.本文标题是对两个bug的总结,即本文内容分为两部分. 题目如下: 设计一个CShape抽象类,类中包含纯虚函数   ...

  6. 第七周项目一-成员函数、友元函数和一般函数有区别(1)

     /**Copyright(c)2016,烟台大学计算机与控制工程学院*All rights reserved*文件名称:123.cpp*作 者:王蕊*完成日期:2016年4月12日*版 本 号: ...

  7. 采用成员函数和友元函数计算给定两个坐标点之间的距离

    设计一个用来表示直角坐标系的Location类,在主程序中创建类Location的两个对象A和B,要求A的坐标点在第3象限,B的坐标点在第2象限,分别采用成员函数和友元函数计算给定两个坐标点之间的距离 ...

  8. java 友元函数_C++ 友元函数用法总结

    C++中的友元机制允许类的非公有成员被一个类或者函数访问,友元按类型分为三种: 普通非类成员函数作为友元.类的成员函数作为友元.类作为友元. 1.友元的内容 友元包括友元的声明以及友元的定义.友元的声 ...

  9. 10.2 运算符重载函数作为类成员函数和友元函数

    Complex operator+(Complex &c2) { Complex c; c.real=real+c2.real; c.imag=imag+c2.imag; return c; ...

最新文章

  1. 各种AJAX方法的使用比较
  2. python 对输入的数据进行排序_使用插入排序对输入数据排序
  3. SAP BDC 技术的分类(转)
  4. Winform中使用NPOI实现导出Excel并文件另存为
  5. Redis源码剖析(九)对象系统概述
  6. python磁盘io_python监控磁盘io
  7. 外卖和快递行业数据_下周一起,整治全面启动!锁定全市外卖、快递行业!
  8. 我们真的仍然需要32位JVM吗?
  9. java秒杀时间与服务器时间_Javascript实现秒杀倒计时(时间与服务器时间同步)...
  10. 论文阅读(1)--Fine-grained Image Classification by Exploring Bipartite-Graph Labels
  11. 【C++深度剖析教程30】C++中抽象类和接口
  12. 如何将Elasticsearch的快照备份至OSS
  13. Anaconda安装tensorflow遇到的wrapt、load error、Twisted问题
  14. Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel 1
  15. python的json模块
  16. java工厂到接口_Java基础——接口简单工厂
  17. 朴灵:云计算的开发者视界中,OpenAPI 是绝对主角 | 凌云时刻
  18. #UML# Astah+Doxygen 将C++源码映射为类图
  19. Matlab:i 和j其实是MATLAB内置函数(built-in function)
  20. Linux命令之大文件分割

热门文章

  1. Git 常用命令总结
  2. 只要7天 传统便利店就能免费升级无人超市
  3. 我爱淘二次冲刺阶段1
  4. sqlserver 自增ID插入指定数据
  5. 淘宝店、淘宝商城排名规则及流量提升培训教程
  6. 【原】开源——基于文件驱动的站点开发
  7. 在线转flv+flash在线录制视频
  8. DevOps 的发展史
  9. 构建前瞻性应用架构的优秀实践
  10. 老牛吃嫩草塞到牙?某程序员追到00后女朋友,却吐槽她整天买盲盒,已经买一屋子了!...