学习《深入探索》时,发现原文中提供的一个代码大致如下(书中第3页)

 class Point3d
{
inline ostream&
operator <<(ostream& os, const Porint3d &pt)
{
...
}
};

竟然编译不过(g++)。╮(╯_╰)╭实在有点坑啊,天真的我以为都是可以编译过的,果然实践是检验真理的唯一标准。网上一堆查,发现大致有两种说法:

  1. 输入输出运算符一般重载为友元函数,...
  2. 双目运算符可以重载为友元函数,也可以重载为成员函数,...

不免疑惑,怎么个情况啊,没具体说什么时候可以,什么时候不可以啊。好吧,自己来吧。

 #include <iostream>
using namespace std; class Point3d
{
private:
double x;
double y;
double z;
public:
Point3d(double tx, double ty, double tz); friend ostream&
operator <<(ostream& os, const Point3d &pt); inline ostream&
operator <<(ostream& os)
{
os<<"inline method, "<<"x: "<<x<<", y: "<<y<<", z: "<<z;
return os;
}
}; ostream&
operator <<(ostream& os, const Point3d &pt)
{
os<<"friend method, "<<"x: "<<pt.x<<", y: "<<pt.y<<", z: "<<pt.z;
return os;
} Point3d::Point3d(double tx, double ty, double tz)
{
x=tx;
y=ty;
z=tz;
} int main(void)
{
Point3d a(,,);
cout<<a<<endl;
a<<cout<<endl;
}

看着第42行代码那傲娇的样子,我只能给跪了。输出结果如下:

 friend method, x: , y: , z:
inline method, x: , y: , z:

总之一句话,输入运算符>>,输出运算符<<,可以成员可以友元。

重载operator<<的更多相关文章

  1. 重载operator new实现检测内存泄漏是否可行

    行与不行,就凭我这水平,说出来未免显示太过自大.不还,我还想根据自己的代码来讨论这个问题. 重载operator new来检测内存只的办法,那就是在new的时候记录指针地址及文件名.行号,在delet ...

  2. C++重载operator的示例

    #include<iostream>#include<vector>using namespace std; class test{public:     int v;   / ...

  3. 深入理解c++构造函数, 复制构造函数和赋值函数重载(operator=)

    注 以下代码编译及运行环境均为 Xcode 6.4, LLVM 6.1 with GNU++11 support, Mac OS X 10.10.2 调用时机 看例子 // // main.cpp / ...

  4. 从零开始学C++之重载 operator new 和 operator delete 实现一个简单内存泄漏跟踪器

    先来说下实现思路:可以实现一个Trace类,调用 operator new 的时候就将指向分配内存的指针.当前文件.当前行等信息添加进Trace 成员map容器内,在调用operator delete ...

  5. 操作符重载operator

    发现一篇好文: 转载: http://www.cnblogs.com/xiehongfeng100/p/4040858.html #include <iostream>#include & ...

  6. C++面向对象高级编程(九)Reference与重载operator new和operator delete

    摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一 Reference 引用:之前提及过,他的主要作用就是取别名,与指针很相似,实现也是基于指针. 1.引用必须有初值,且不能引用nul ...

  7. c++重载operator的示例 非原创

    #include<iostream> #include<vector> using namespace std; class test{ public: int v; /*构造 ...

  8. c++ 运算符重载operator

    一般格式为: 函数类型 operator 运算符名称(形参列表){ 对运算符的重载 } 注意函数名是由operator和运算符组成.在上面的一般格式中,operator是关键字,是专门用于重载运算符函 ...

  9. C++ 操作符重载 (operator)

    重载不能改变操作符的优先级 如果一个内建操作符是一元的,那么所有对它的重载仍是一元的.如果是二元的重载后也是二元的 下面看一个有代表性的例子:: 头文件Complex.h: #includeusing ...

随机推荐

  1. 利用WCF与Android实现图片上传并传参

    利用WCF与Android实现图片上传并传参 最近做一个项目后端使用WCF接收Android手机拍照并带其它参数保存到服务器里:刚好把最近学习的WCF利用上,本以为是个比较简单的功能应该很好实现,没想 ...

  2. Spring的Service层与Dao层解析

    本文转载于网络,觉得写得很透彻. dao完成连接数据库修改删除添加等的实现细节,例如sql语句是怎么写的,怎么把对象放入数据库的.service层是面向功能的,一个个功能模块比如说银行登记并完成一次存 ...

  3. 超详细LAMP环境搭建

    一.准备工作 1.安装编译工具gcc.gcc-c++ 注意解决依赖关系,推荐使用yum安装,若不能联网可使用安装光盘做为yum源—— 1)编辑yum配置文件: # mount /dev/cdrom / ...

  4. [转载]expect spawn、linux expect 用法小记

    原文地址:expect spawn.linux expect 用法小记作者:悟世 使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写 ...

  5. ClassLoader的等级加载机制

    摘自深入分析java web技术内幕

  6. mybatis中updateByPrimaryKeySelective

    mybatis中updateByPrimaryKeySelective等选择性操作在判断时对于VARCHAR类型需要同时判断非空和非空串 <if test="description ! ...

  7. OOAD(面向对象分析和设计)GRASP之创建者模式(Creator)又称生成器模式学习笔记

    说OOAD是一门玄学,一点都不为过.又或许是因为我之前一直没有很好的建立面向对象的思想,更有可能是因为练得不够多...总之,一直没能很好理解,哪怕把一本叫做<UML和模式应用>的书翻来覆去 ...

  8. C语言之if和switch的分别

    If和switch的互换规则 用if语句能实现的东西,用switch也可以实现 用switch语句能实现的东西,用if也可以实现 1.如果是判断范围的时候,用switch不太好做,没法直接做 2.如果 ...

  9. Java入门第三季排序练习

    package imooc_collection_map_demo; import java.util.ArrayList;import java.util.Collections;import ja ...

  10. 仿QQ空间视差效果,ListView.setHeader( )

    根据listview的手指移动事件,动态设置listview上面的图片的宽高,并在手指放开的时候 实现图片的动画(随时间变化的动画值) ValueAnimator.ofInt ( ) import a ...