当前位置: 首页 > news >正文

重载输出操作符()时遇到的问题

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

#include <iostream>
using namespace std;

class point
{
public:
    point():x(0.0),y(0.0){}
    point(double a, double b){ x=a; y=b; }
    double getx(){ return x;}
    double gety(){ return y;}
    void setx(double val){ x = val;}
    void sety(double val){ y = val;}
    point operator+(point &p)
    {
        point sum(x+p.getx(),y+p.gety());
        return sum;
    }

    friend ostream& operator<< (ostream &out,point &p) 
    {
        out<<"("<<p.x<<","<<p.y<<")";
        return out;
    }
private:
    double x,y;
};

int main()
{
    point a,b,c;
    a.setx(1.2);
    a.sety(2.1);
    b.setx(2.5);
    b.sety(3.2);

    c = a+b;
    cout<<c<<endl;
    return 0;
}

上面的小例子是来自coursera课程中的《C++ for C programmers》的ppt,自己输入一遍运行发现老是出错,出错的原因是“<<”操作符重载的问题。原来类的成员函数在重载一元操作符时,不能在显式声明参数,从在二元操作符时,只能显式声明一个形参,这个形参表示右操作数,左操作数由引用参数提供。所以如果要重载"<<"的话,必须使用friend。

操作符重载

C++语言提供的标准运算符可以在类中重新定义的机制——运算符重载。

C++中可被重载的操作符:+  - *    /      %    ^     &    |      ~

! =   <     >     +=   -=    *=   /=    %=

^=       &=  | =   <<   >>   >>= <<= ==  !=

<=       >=   &&  ||      ++   --     [ ]    ()    ->

->*   ,     new new[]     delete      delete[ ]

重载操作符函数时参数要求:

§        对于一元操作符函数:

l         重载为成员函数时,不能再显式声明参数。

§        对于二元操作符函数:

l         重载为成员函数时,只能显式声明一个形参,这个形参表示右操作数,左操作数由引用参数提供。

重载操作符要注意的问题:

§        对操作符的重载不改变操作符的优先级和结合性。

§        重载不改变操作符的语法。

§        如果一个内建操作符是一元的,那么所有对它的重载仍是一元的。

§        如果一个内建操作符是二元的,那么所有对它的重载仍是二元的。

§        被重载的操作符要么是一个类的成员函数,要么在他的参数表中包含一个类对象。

 

Friend 函数

§        类的私有成员只能被该类的成员函数和该类的friend函数访问;类的保护成员只能被该类的或其派生类的成员函数和该类的friend函数访问。

§        为了使函数f成为类Cfriend,在类C的声明里使用关键字friendf进行声明。

§        该声明的作用是赋予f访问C的私有和保护成员的权力,因为f不是成员函数,该声明可以放在C中的privateprotectedpublic的任意部分。

§        Friend函数不仅可以是顶层函数,也可以是另一个类中的成员函数。

§        一个函数可以同时被多个类声明为“friend”,这样就可以引用多个类中的私有数据。

§        不仅可以将一个函数声明为一个类的friend, 也可以将一个类声明为另一个类的friend。

 

§        声明friend类的一般形式是:

              friend类名;

       例如可以在上例中将整个Time类声明为Date类的friend。这样time中的所有函数都可以访问Date中的所有成员。

§        Friend的关系是单向的,不是双向的,如果声明了A是B的friend,不等于B是A的friend.

§        Friend的关系不能传递。

§        friend函数不是类的成员函数,却可以访问该类的私有和保护成员,从严格意义上来说,这不符合面向对象原则。

§        因此friend函数是存在争议的,且容易被误用。

§        建议仅在重载操作符时使用friend函数。

 


转载于:https://my.oschina.net/u/923087/blog/279208

相关文章:

  • CentOS 6系统下安装 JDK1.6
  • 安装graylog2日志服务器
  • javascript学习笔记之时间定制器
  • Fedora下安装Retext
  • Concurrent
  • 阿拉伯数字转中文数字表示[PHP]
  • oral_quiz-#扑克牌是不是顺子#
  • Android使用百度地图的注意点
  • 移动互联网金融的全方位服务时代已经到来
  • 再读《精通css》03:引入和注释
  • 长假结束了
  • saltstack(九)returner
  • jdbc ResultSet 处理工具类DbUtil
  • 结构之美——优先队列基本结构(四)——二叉堆、d堆、左式堆、斜堆
  • web app开发——使用jQuery Mobile创建餐厅订餐应用
  • 【Leetcode】101. 对称二叉树
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • JAVA_NIO系列——Channel和Buffer详解
  • JavaScript设计模式与开发实践系列之策略模式
  • mysql_config not found
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Shadow DOM 内部构造及如何构建独立组件
  • use Google search engine
  • 电商搜索引擎的架构设计和性能优化
  • 规范化安全开发 KOA 手脚架
  • 简单易用的leetcode开发测试工具(npm)
  • 移动端 h5开发相关内容总结(三)
  • 异常机制详解
  • ​2021半年盘点,不想你错过的重磅新书
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • # .NET Framework中使用命名管道进行进程间通信
  • (4)STL算法之比较
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (二)windows配置JDK环境
  • (十一)图像的罗伯特梯度锐化
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .NET 8.0 发布到 IIS
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET 回调、接口回调、 委托
  • .net 获取url的方法
  • .Net程序帮助文档制作
  • .net程序集学习心得
  • .net实现客户区延伸至至非客户区
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • @Autowired多个相同类型bean装配问题
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • @PreAuthorize注解
  • @Repository 注解
  • [16/N]论得趣
  • [ActionScript][AS3]小小笔记
  • [Android Studio 权威教程]断点调试和高级调试
  • [ASP.NET 控件实作 Day7] 设定工具箱的控件图标