学习《深入探索》时,发现原文中提供的一个代码大致如下(书中第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. jQuery图片切换插件jquery.cycle.js

    Cycle是一个很棒的jQuery图片切换插件,提供了非常好的功能来帮助大家更简单的使用插件的幻灯功能 下载cycle插件并引入,此时,注意把引入它的代码放在引入jQuery主文件之后. <he ...

  2. ul和li实现分两列(多列)布局显示

    简单语句实现DIV+CSS分两列(多列)布局显示 <style type="text/css"> .my ul { width: 210px; } .my li { w ...

  3. HDU3930(离散对数与原根)

    题目:Broot 题意:给出k,m,newx的值,求方程x^k(mod m)=newx的解,其中m为素数. 解法步骤: (1)先暴力求m的原根g (2)大步小步求g^t1(mod m)=newx (3 ...

  4. ASP.NET Web API的消息处理管道:"龙头"HttpServer

    ASP.NET Web API的消息处理管道:"龙头"HttpServer 一般来说,对于构成ASP.NET Web API消息处理管道的所有HttpMessageHandler来 ...

  5. How to use USB 3G dongle/stick Huawei E169/E620/E800 ( Chip used Qualcomm e1750) in Linux (China and world)

    Using this 3G module in Linux is so great. I want it. So I made it. The 3G dongle of Huawei E169/E62 ...

  6. 激活phpstorm10.0.1

    注册时选择“License server”输入“http://idea.lanyus.com/”点击“OK”快速激活JetBrains系列产品

  7. Spring.Net-DI依赖注入和Ioc控制反转

    Spring.Core作为整个Spring框架的基础,实现了依赖注入的功能.Spring框架的其它模块都要依赖或扩展该模块. IObjectFactory接口,该接口实现了工厂模式,使用它可以帮我们创 ...

  8. SQL注入浅水攻防

    啥是SQL注入(SQL Injection) 所谓SQL注入就是把SQL命令插入到表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造 (或影响 ...

  9. android.database.CursorIndexOutOfBoundsException: Index <m> requested, with a size of <n>

    遇到这样的问题比较郁闷,造成上述问题的原因也是多种多样的. 总结一下原因: 1:得到cursor对象,没有moveToPosition()或者moveToNext()等游标操作就进行cursor.ge ...

  10. javaPNS进阶-高级推送技巧

    1 创建 payloads javaPNS提供了很多简单易用的通知方式(Push类里的alert,badges,sounds等)这些让你不用自己处理payload.但是我们的程序可能需要复杂的推送信息 ...