运算符重载:友元(friend)函数问题

简介:

 运算符在重载的时候有两种方式,一是成员函数方式,二是成友元(friend)函数方式。 

成员函数比较简单。下面是一个示例代码: 
class Complex 

private: 
double real; 
double img; 
public: 
Complex(){} 
Complex(double i,double j):real(i),img(j) 


        Complex operator+(const Complex &cx) 
        { 
                return Complex(real+cx.real,img+cx.img); 
        } 
}; 
如果是设置成友元函数,一定要注意: 
(1)当重载友元函数时,将没有隐含的参数this指针。这样,对双目运算符,友元函数有2个参数,对单目运算符,友元函数有一个参数。 
(2)有些运行符不能重载为友元函数,它们是:=,(),[]和->。 
因此,上面那个+运算符如果是重载为友元函数的话,应该写成: 
class Complex 

private: 
    double real; 
    double img; 
    public: 
    Complex(){} 
    Complex(double i,double j):real(i),img(j) 
    { 
    } 

    //  注意: 有两个参数 
    friend Complex operator+(const Complex &cx1,const Complex &cx2) 
    { 
        return Complex(cx1.real+cx2.real,cx1.img+cx2.img); 
    }


    void Out() 
    { 
        cout << real << "+" << img << "i" << endl; 
    } 
}; 
还需要注意一点,有的VC 6.0编译器在编译上面代码的时候会报错,错误为: 
fatal error C1001: INTERNAL COMPILER ERROR 
原因是VC编译器本身的问题。 
解决办法: 在类的声明之前再加上一个声明。具体代码如下: 
class Complex; 
Complex operator+(const Complex &cx1,const Complex &cx2); 
class Complex 

private: 
double real; 
double img; 
public: 
Complex(){} 
Complex(double i,double j):real(i),img(j) 


// 注意:有两个参数 
friend Complex operator+(const Complex &cx1,const Complex &cx2) 

return Complex(cx1.real+cx2.real,cx1.img+cx2.img); 

void Out() 

cout << real << "+" << img << "i" << endl; 

}; 
这样就没有问题了。











本文转hackfreer51CTO博客,原文链接:http://blog.51cto.com/pnig0s1992/555560,如需转载请自行联系原作者

相关文章
|
算法 关系型数据库 MySQL
TiDB保证数据一致性的策略与优势
【2月更文挑战第28天】TiDB作为一款分布式数据库,通过其独特的策略和优势,确保在分布式环境下数据的一致性。本章将详细探讨TiDB保证数据一致性的核心策略,包括其采用的分布式一致性协议、数据复制机制以及容错处理等方面,并阐述这些策略所带来的优势。通过理解TiDB的数据一致性保证机制,读者将能更深入地认识其作为分布式数据库的价值。
|
消息中间件 Java 中间件
秒懂消息队列MQ,万字总结带你全面了解消息队列MQ
消息队列是大型分布式系统不可缺少的中间件,也是高并发系统的基石中间件,所以掌握好消息队列MQ就变得极其重要。接下来我就将从零开始介绍什么是消息队列?消息队列的应用场景?如何进行选型?如何在Spring Boot项目中整合集成消息队列。
24563 10
秒懂消息队列MQ,万字总结带你全面了解消息队列MQ
|
5月前
|
Java 数据库连接 数据库
Java 组件详细使用方法与封装实战指南
本指南详解Java核心组件使用与封装技巧,涵盖跨平台开发、面向对象编程、多线程、数据库操作等关键内容,并提供工具类、连接池、异常及响应结果的封装方法。结合Spring框架、MyBatis、Spring Boot等主流技术,助你掌握高质量Java组件设计与开发实践。
184 2
C/C++ 关于double和float两种类型的区别
C/C++ 关于double和float两种类型的区别
C/C++ 关于double和float两种类型的区别
|
8月前
|
人工智能 自然语言处理 IDE
通义灵码 2.0 评测:AI 赋能编程,开启高效研发新旅程
通义灵码2.0通过AI赋能编程,显著提升开发效率与代码质量。安装便捷,支持自然语言描述需求自动生成高质量代码框架及注释,大幅简化新功能开发流程。其单元测试Agent能快速生成全面测试用例,覆盖更多边界情况。相比1.0版本,2.0在智能问答和代码生成速度上均有显著提升,为开发者带来高效研发新体验。
392 8
|
移动开发 前端开发 Java
基于jeecg-boot的flowable流程提供一种动态设置发起人部门负责人的方式
基于jeecg-boot的flowable流程提供一种动态设置发起人部门负责人的方式
377 0
|
Web App开发 Windows
Windows 记录一次磁盘相关的PC卡顿问题
【10月更文挑战第26天】本文记录了一次Windows系统中因磁盘问题导致的PC卡顿现象及其解决过程。通过查看任务管理器发现磁盘使用率高,经磁盘碎片整理、优化启动项与后台程序、更新磁盘驱动等步骤,最终解决了卡顿问题。建议定期进行磁盘维护,合理管理启动项,及时更新驱动以预防类似问题。
242 5
|
网络安全 Docker 容器
【Bug修复】秒杀服务器异常,轻松恢复网站访问--从防火墙到Docker服务的全面解析
【Bug修复】秒杀服务器异常,轻松恢复网站访问--从防火墙到Docker服务的全面解析
446 0
|
存储 安全 Unix
服务器的常用系统
【5月更文挑战第5天】服务器的常用系统
415 9
|
NoSQL Redis
深入了解Redis持久化与备份策略
本篇深入介绍了Redis的持久化和备份机制,为读者提供了全面的了解和实际操作示例。我们首先探讨了RDB持久化方式,通过将数据集的快照保存到磁盘文件,实现了数据的定期备份和恢复。接着,详细介绍了AOF持久化,将每个写操作记录到日志文件中,确保了数据的持久性和安全性。我们还讨论了混合持久化,将RDB和AOF结合,兼顾了快速恢复和持久化的需求。
836 0
下一篇
开通oss服务