• 流运算符的重载


    1.cout 是在iostream 中定义的,是ostream的对象

    ostream& ostream::operator<<(int n)
    {
        //
        return *this;
    }
    ostream& ostream::operator<<(const char* s)
    {
        //
        return *this;
    }

    2.类似Java中重写String方法一样,C++中一般重载“<<”运算符,一般为重载为全局函数

    Because:

    对输出运算符的重载

     void operator<<(ostream& out) {    out << _year << "-" << _month << "-" << _day << endl; 

    会出现一个问题,只能写成

    d<<cout      //打印d中的年月日

    因为函数的第一个参数是this指针,第二个参数才是我们传进去的 out,但是这与std中的cout使用习惯完全不符,我们的所打印变量是应该在cout的右边,如

      cout<<d<<endl

    这样的重载和普通的函数没有两样,也就失去了重载函数的目的所在。

    那么这样,我们便不可以把输出运算符的重载写成成员函数,写成成员函数去实现功能,能实现功能 但失去重载本身的意义。

    那么我们在类外写重载函数,此时输出运算符的重载函数是一个全局的。

     3.例子

    #include <iostream>
    #include <string>
    #include <iomanip>
    #include <cstdlib>
    
    using namespace std;
    
    class Complex
    {
    private:
        double real;
        double imag;
    public:
        Complex(double r=0.0,double i=0.0):real(r),imag(i){}
        friend ostream& operator<<(ostream & os,const Complex& c);
        friend istream& operator>>(istream & is,const Complex& c);//起到声明friend作用,为全局函数做准备
    };
    
    ostream& operator<<(ostream& os,const Complex& c)
    {
        os<<c.real<<'+'<<c.imag<<'i';
        return os;
    }
    
    iostream& operator>>(iostream& is,const Complex& c)
    {
        string s;
        is>>s;
        int pos=s.find("+",0);
        string sTmp=s.substr(0,pos);
        c.real=atof(sTmp.c_str());
        sTmp=s.substr(pos+1,s.length()-pos-2);
        c.imag=atof(sTmp.c_str());
        return is;
    }
  • 相关阅读:
    Docker常用基础命令详解
    Docker安装教程(超详细)
    IDEA 新建 Java 项目 (图文讲解, 良心教程)
    SpringBoot2.0之@Configuration注解
    idea的安装和无限期试用
    vue 取消上次请求
    calc()使用通用的数学运算规则,但是也提供更智能的功能:
    pdfh5 移动端 查看pdf
    Git处理Failed to connect to www.google.com port 80: Timed out
    对象排序
  • 原文地址:https://www.cnblogs.com/-Asurada-/p/10674249.html
Copyright © 2020-2023  润新知