C++运算符重载形式--成员函数or友元函数?
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友元函数?相关推荐
- C++运算符重载函数作为类成员函数和友元函数
C++运算符重载函数作为类成员函数 1.1成员函数的重载运算符左侧是一个类对象,而且与运算符函数类型相同. 因为必须通过类的对象去调用该类的成员函数,而且只有运算符重载函数和返回值类型相同,运算结果才 ...
- C++运算符重载(成员函数方式)
一.运算符重载 C++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作.如果将C++中这些现存的运算符直接作用于用户自定义的类型数据上,会得到什么样 ...
- C++运算符重载函数作为友元函数
运算符重载函数作为友元函数 在前面的程序例子中对运算符"+"进行了重载,使之能用于两个字符串的相加.在该例中运算符重载函数 operator +(); 作为 my_string类中 ...
- (P22)运算符重载:运算符重载 ,成员函数重载 ,非成员函数重载 ,运算符重载规则
文章目录 1.运算符重载 2.成员函数重载 3.非成员函数重载 4.运算符重载规则 1.运算符重载 运算符重载允许把标准运算符(如+.-.*./.<.>等)应用于自定义数据类型的对象 直观 ...
- C++之常引用对象只能调用常成员函数、重载为成员函数和友元函数的区别
近日写了一道题,遇到了新bug,使博主对C++的逻辑严密性有了更深的体会,特写此博客.本文标题是对两个bug的总结,即本文内容分为两部分. 题目如下: 设计一个CShape抽象类,类中包含纯虚函数 ...
- 第七周项目一-成员函数、友元函数和一般函数有区别(1)
/**Copyright(c)2016,烟台大学计算机与控制工程学院*All rights reserved*文件名称:123.cpp*作 者:王蕊*完成日期:2016年4月12日*版 本 号: ...
- 采用成员函数和友元函数计算给定两个坐标点之间的距离
设计一个用来表示直角坐标系的Location类,在主程序中创建类Location的两个对象A和B,要求A的坐标点在第3象限,B的坐标点在第2象限,分别采用成员函数和友元函数计算给定两个坐标点之间的距离 ...
- java 友元函数_C++ 友元函数用法总结
C++中的友元机制允许类的非公有成员被一个类或者函数访问,友元按类型分为三种: 普通非类成员函数作为友元.类的成员函数作为友元.类作为友元. 1.友元的内容 友元包括友元的声明以及友元的定义.友元的声 ...
- 10.2 运算符重载函数作为类成员函数和友元函数
Complex operator+(Complex &c2) { Complex c; c.real=real+c2.real; c.imag=imag+c2.imag; return c; ...
最新文章
- 各种AJAX方法的使用比较
- python 对输入的数据进行排序_使用插入排序对输入数据排序
- SAP BDC 技术的分类(转)
- Winform中使用NPOI实现导出Excel并文件另存为
- Redis源码剖析(九)对象系统概述
- python磁盘io_python监控磁盘io
- 外卖和快递行业数据_下周一起,整治全面启动!锁定全市外卖、快递行业!
- 我们真的仍然需要32位JVM吗?
- java秒杀时间与服务器时间_Javascript实现秒杀倒计时(时间与服务器时间同步)...
- 论文阅读(1)--Fine-grained Image Classification by Exploring Bipartite-Graph Labels
- 【C++深度剖析教程30】C++中抽象类和接口
- 如何将Elasticsearch的快照备份至OSS
- Anaconda安装tensorflow遇到的wrapt、load error、Twisted问题
- Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel 1
- python的json模块
- java工厂到接口_Java基础——接口简单工厂
- 朴灵:云计算的开发者视界中,OpenAPI 是绝对主角 | 凌云时刻
- #UML# Astah+Doxygen 将C++源码映射为类图
- Matlab:i 和j其实是MATLAB内置函数(built-in function)
- Linux命令之大文件分割