C++中模板类的输入输出流重载函数实现

2023-05-16

(转)C++模板类中操作符重载之"<<"和">>"重载  

2011-01-10 17:05:31|  分类: IT与程序 |  标签: |字号 订阅

在模板类中输入流“》”和输出流“《”的重载,若使用友元在类内声明,在类外实现,那么连接时将会报错,但我们可以采用以下三种方式来实现输出流"<<"和"输入流>>"的重载。

一、将输出流"<<"和"输入流>>"重载的实现写在类中

#include "stdafx.h"
#include   <iostream>
using   namespace   std;  
   
template<class T>  
class Test  
{  
   public:  
      Test(const T& t):data(t){}
      //---------------------------------------------
      friend ostream& operator<<(ostream& out,Test<T>& t)    //输出流重载声明及实现
      {
           return out<<"data   is   "<<t.data;
      } //--------------------------------------------
      friend istream& operator>>(istream& in,Test<T>& t)      //输入流重载声明及实现
      {
          return in>>t.data;
      }//---------------------------------------------
   private:  
      T data;  
};//-----------------------------------------------------------------      
      
int   main()  
{  
   Test<int> b(3);  
   cout<<b<<'\n';  
   cin>>b;
   cout<<b<<'\n';
   return 0;
}

那么输入输出流重载为什么不能在类内声明,类外实现呢??因为模板比较特殊,若果在模板类外实现重载的话:

template<class T>
ostream& operator<<(ostream& out,Test<T>& t)
{
        return out<<"data   is   "<<t.data;
} //--------------------------------------------

上面正好是函数模板的定义,而我们知道操作符重载函数不是类的成员函数,因此此处相当于定义了一个新的函数模板(不同于类中的friend ostream& operator<<(ostream& out,Test<T>& t) )。但若去掉template<class T> ,函数中的参数Test<T>就不知是什么类型,所以不能在模板类内声明,类外实现操作符重载。

二、既然类外实现相当于重定义了一个函数模板,那么只要他不使用类的私用成员即可,因此重载的函数模板只有通过类的公有成员函数来实现对类的私有成员的操作,这样不必在类内声明它为友元,直接在类外重载即可。

#include "stdafx.h"
#include   <iostream>
using   namespace   std;  
   
template<class T>  
class Test  
{  
   public:  
      Test(const T& t):data(t){}
      T GetData()const{return data;}
      void SetData(T &item){data=item;}
   private:  
      T data;  
};//-----------------------------------------------------------------
template<class T>      
ostream& operator<<(ostream& out,Test<T>& t)   
{
      return out<<"data   is   "<<t.GetData();
} //--------------------------------------------
template<class T>
istream& operator>>(istream& in,Test<T>& t)     
{
     T item;
    in>>item;
    t.SetData(item);
    return in;
}//---------------------------------------------      
int   main()  
{  
   Test<int> b(3);  
   cout<<b<<'\n';  
   cin>>b;
   cout<<b<<'\n';
   return 0;
}  

三、使用过渡函数

#include "stdafx.h"
#include   <iostream>
using   namespace   std;  
   
template<class   T>  
class   Test  
{  
   public:  
      Test(const T& t):data(t){}
      //---------------------------------------------
      template<class CharT,class CharTraits>  
      basic_ostream<CharT,CharTraits>& Output(basic_ostream<CharT,CharTraits>& out)const    //输出流过渡函数
      {
            return out<<"data   is   "<<data;
      } //--------------------------------------------
      template<class   CharT,class   CharTraits>  
      basic_istream<CharT,CharTraits>& Input(basic_istream<CharT,CharTraits>& in)    //输入流过渡函数
      {
          return in>>data;
      }//---------------------------------------------
   private:  
      T data;  
};//-----------------------------------------------------------------      
template<class T,class CharT,class CharTraits>  
basic_ostream<CharT,CharTraits>& operator<<(basic_ostream<CharT,CharTraits>& out,const Test<T>& t)   //输出流重载
{  
    return t.Output(out);  
}//------------------------------------------------------------------      
template<class T,class CharT,class CharTraits>  
basic_istream<CharT,CharTraits>& operator>>(basic_istream<CharT,CharTraits>& in,Test<T>& t)   //输入流重载
{  
    return t.Input(in);  
}//------------------------------------------------------------------      
int   main()  
{  
   Test<int>   b(4);  
   cout<<b<<'\n';  
   cin>>b;
   cout<<b<<'\n';
   return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++中模板类的输入输出流重载函数实现 的相关文章

  • HttpClient使用HttpGet进行json数据传输

    JSON字符串需要用urlencoding编码对绝大多数HTTP client而言 xff0c URL长度都有上限 xff0c 所以不能传太大的JSON xff0c 一般而言几K应该没问题 xff0c 但是再长点就不好说了 import j
  • 【Linux 内核技术】RCU

    在阅读linux 3 10版本的socket 一节源码时 xff0c 遇到了一个 span class token function rcu dereference span span class token punctuation spa
  • 选择题改错

    一 单选 1 2 以下程序的运行结果是 xff08 xff09 int main void printf 34 s 5 3s n 34 34 computer 34 34 computer 34 return 0 A A computer
  • 安装程序的安装界面为乱码的问题

    有的时候程序的安装界面为乱码 xff0c 多出在msi程序中 xff0c 这其实是AppLocale的bug导致的 xff0c 解决的办法不用删除AppLocale xff0c 只需要到c windows AppPatch下 xff0c 删
  • 周星馳 電影經典對白

    周星馳 電影經典對白 http www jd bbs com viewthread php tid 61 1209979 amp extra 61 page 3D1 1 曾經有一份真誠的愛擺在我的面前 xff0c 但是我沒有珍惜 xff0c
  • Eclipse环境搭建

    Eclipse 环境搭建 C 43 43 还没有写完 xff5e xff5e xff5e xff5e 最近 xff0c 在作一个项目 xff0c 要求所有的软件 xff0c 包括操作系统 开发工具 等 xff0c 所有的软件都要使用正版的
  • 为什么要学习python

    时隔多年以后 xff0c 我又回归CSDN了 xff0c 回来学习学习 刚开始工作的时候 xff0c 在CSDN这里找各种资源 xff0c 各种学习 xff0c 请教 xff0c 等等 xff0c 确实学到了不少 也许是因为自己是做嵌入式开
  • 汇编

    hu bi n 1 动词 xff0c 把资料或文章等编辑在一起 2 名词 xff0c 编辑在一起的资料 xff0c 文献 汇编简介 汇编语言 Assembly Language 是面向机器的程序设计语言 汇编语言中 xff0c 用助记符 M
  • 杨石头智立方47:你我都必须学习的十大管理原则

    http blog sina com cn s blog 4ce6ecc60100fy5v html tj 61 1 一 素养 蓝斯登原则 xff1a 在你往上爬的时候 xff0c 一定要保持梯子的整洁 xff0c 否则你下来时可能会滑倒
  • Media change: lase insert the disc labled

    在Debian中使用apt get安装软件包时经常会提示让你插入netinst的光盘 xff1a Media change please insert the disc labeled 当没有时就无法进行安装了 xff0c 这时可以打开文件
  • Source Insight使用教程

    作为一个开放源代码的操作系统 xff0c Linux 附带的源代码库使得广大爱好者有了一个广泛学习 深入钻研的机会 xff0c 特别是Linux 内核的组织极为复杂 xff0c 同时 xff0c 又不能像windows 平台的程序一样 xf
  • 注册表ShellIconOverlayIdentifiers中没有svn相关的选项

    此问题最初是由于svn不显示Icon入手排查的 打开注册表 HKEY LOCAL MACHINE SOFTWARE Microsoft Windows CurrentVersion Explorer ShellIconOverlayIden
  • CreateProcess注入方法

    采用 CreateProcess 的方法 xff0c 实现起来比较复杂 xff0c 但没有上面几种方法的局限性 且可以用其他工 具 xff08 VC 等 xff09 调试注入的 DLL 下面进行介绍 原理如下 xff1a 1 xff0e 用
  • U盘防毒最强方案(创建删不掉的autorun.inf文件夹)

    病毒 xff0c 每个人都深受其害 xff0c 痛恨不已 xff0c 特别是现在移动设备MP3 MP4 手机 U盘 移动硬盘飞速发展的时代 xff0c 病毒也随着这些移动设备和网络快速蔓延和滋生 xff0c 所以如何防止病毒入侵到自己的爱机
  • Windows 7桌面显示图标窗口类名称

    Windows 7下 xff0c 我们取桌面图标窗口的句柄使用以下语句 在windows XP时代 xff0c 我们获取桌面图标窗口的句柄往往用一下语句 xff1a lt pre gt lt pre name 61 34 code 34 c
  • EnumThreadWindows枚举线程的所有窗口

    BOOL CALLBACK EnumThreadWndProc HWND hwnd LPARAM lParam std list lt HWND gt plist 61 std list lt HWND gt lParam plist gt
  • MFC窗口创建、销毁消息流程

    Windows 消息处理机制 MFC 应用程序中处理消息的顺序 1 AfxWndProc 该函数负责接收消息 xff0c 找到消息所属的 CWnd 对象 xff0c 然后调用 AfxCallWndProc 2 AfxCallWndProc
  • 数字螺旋方阵C++实现

    include lt iostream h gt include lt stdio h gt void main int k h i j n int sum 61 0 int q 61 1 while 1 k 61 h 61 i 61 j
  • 过桥问题动画显示(多线程,简陋版)

    Code include lt windows h gt include lt iostream h gt include lt stdio h gt void gotoxy int x int y COORD c c X 61 x c Y

随机推荐

  • 【大三操作系统实验】 请求页式管理中的置换算法

    xff08 1 xff09 FIFO算法总是选择在内存驻留时间最长的一页将其淘汰 FIFO算法认为调入内存的页不再被可能性要比其他页大 xff0c 因而选择最先调入内存的页换出 xff08 2 xff09 LRU算法基本思想 xff1a 当
  • 【大三操作系统实验】 作业进程调度算法

    xff08 1 xff09 FCFS算法 将用火作业和就绪进程按提交顺序或变为就绪状态的先后排成队列 xff0c 并按照先来先服务的方式进行调度处理 xff0c 是一种最普遍和简单的方法 xff08 2 xff09 轮转法 让每个进程中就绪
  • 成为游戏开发程序员,要学些什么

    一 游戏程序开发的工作主要包括哪些方面 游戏开发中的程序开发主要由如下几个方面组成 xff1a 1 xff0e 图形引擎 2 xff0e 声音引擎 3 xff0e 物理引擎 4 xff0e 游戏引擎 5 xff0e 人工智能或游戏逻辑 6
  • java反射记录2(20160512更新)

    private void reflectionMethodTest 获取方法 Method invalidateMethod 61 getReflectionMethod 34 android view View 34 34 invalid
  • 五险一金,你知道多少

    具体的社保构成比例为 养老保险 单位每个月为你缴纳21 你自己缴纳8 医疗保险 单位每个月为你缴纳9 你自己缴纳2 外加10块钱的大病统筹大病统筹主要管住院这块 xff1b 失业保险 单位每个月为你缴纳2 你自己缴纳1 工伤保险 单位每个月
  • STL与boost

    待细化 STL STL是standard Template Library即标准模板库的英文缩写 xff0c STL标准模板库 xff08 Standard Template Library xff09 泛型编程思想 STL主要由几个核心部
  • 头文件和库文件有何区别和联系

    头文件中有函数的申明 xff0c 库文件实现函数的定义 比如 xff0c printf函数 使用时应包括stdio h xff0c 打开stdio h你只能看到 xff0c printf这个函数的申明 却看不到printf具体是怎么实现的
  • Visual Studio Code 如何编写运行 C、C++ 程序?

    作者 xff1a 知乎用户 链接 xff1a https www zhihu com question 30315894 answer 154979413 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c 非
  • c++回调函数/ROS回调函数

    以下均是个人在实际耕码的过程中遇到的问题和整理的结果 xff0c 可能会有不对的地方 xff0c 望各位指正与交流 我会有喵的 c 43 43 中的回调函数 xff1a A 34 callback 34 is any function th
  • r329开发板部署aipu模型

    上篇文章r329模拟仿真实现了在模拟器上仿真网络 xff0c 现在申请到了开发板 xff0c 就有机会在上面测试下了 本文需要的原材料 r329开发板sd 卡sd卡读卡器typec的usb线一台windows电脑一台linux电脑 开发板全
  • centos 网卡 bridge

    Interface configuration example yum install y libvirt virt install bridge utils ifcfg em2 xff1a TYPE 61 Ethernet DEVICE
  • KVM interface passthrough

    nbsp nbsp nbsp nbsp kvm passthrouth sr iov nbsp nbsp https blog csdn net yzy1103203312 article details 81092647 nbsp nbs
  • JNIEXPORT void JNICALL Java_testdll_set(JNIEnv *, jclass, jint j) //i = j;

    例如程序testdll java xff0c 内容为 xff1a public class testdll static System loadLibrary 34 goodluck 34 public native static intg
  • unicode 与UTF8

    utf 8 编码是在传输中或者保存时候是字节码 xff0c 没有大小端的问题 以存储为例 xff1a 不管是英文 xff08 1个字节 xff09 还是中文 xff08 3个字节 xff09 xff0c 不用考虑大小端问题 xff0c 直接
  • sip register超时和invite超时

    sip的register重传与超时 当发送第一个register时候 xff0c 开启定时器 xff0c 超过500ms没有响应 xff0c 重新发送 在发送的register 1s内没有响应 xff0c 在重发 xff0c 一致到32s的
  • 线性地址转物理地址

    二 线性地址转物理地址 前面说了Linux中逻辑地址等于线性地址 xff0c 那么线性地址怎么对应到物理地址呢 xff1f 这个大家都知道 xff0c 那就是通过分页机制 xff0c 具体的说 xff0c 就是通过页表查找来对应物理地址 准
  • H264/H265 PS 流分析

    对于第一帧的第一个包开始为PS头 43 系统头 43 节目映射流 1 Pack start code xff1a 包起始码字段 xff0c 值为0x000001BA的位串 xff0c 用来标志一个包的开始 2 System clock re
  • linux c/c++ 程序崩溃时打印调用栈

    本文章是在总结前人的帖子后实现的 xff0c 经过验证是可以使用的 但是在个别信号下 xff0c 还是不能详细的打印有效信息 void dump void char szLog MAX LOG LEN 61 0 int j nptrs co
  • sip stale

    ii Stale 一个标志 xff0c 用来指示客户端先前的请求因其nonce值过期而被拒绝 如果stale是TRUE xff08 大小写敏感 xff09 xff0c 客户端可能希望用新的加密回应重新进行请求 xff0c 而不用麻烦用户提供
  • C++中模板类的输入输出流重载函数实现

    转 C 43 43 模板类中操作符重载之 34 lt lt 34 和 34 gt gt 34 重载 2011 01 10 17 05 31 分类 xff1a IT与程序 标签 xff1a 字号 大 中 小 订阅 在模板类中输入流 和输出流