流插入运算符为什么要被重载为全局函数?

https://www.coursera.org/learn/cpp-chengxu-sheji/lecture/c3tbl/liu-cha-ru-yun-suan-fu-he-liu-ti-qu-yun-suan-fu-de-zhong-zai  笔记

Part 1. 流插入运算符的重载:

cout<<5<<endl;

cout是在iosream中定义的一个ostream对象

iostream中对“<<”进行了重载。  cout<<5; 即 cout.operator<<(5);

iostream中对"<<"的重载函数:

ostream & ostream::operator<<(int n){
     ……//输出n的代码
     return *this; // *this 就是cout
}

Part 2. 流插入运算符为什么要被重载为全局函数

假设有Complex对象c, 如果要用cout<<c来输出, 就要对“<<“重载。

但是1)不能在ostream类中对"<<"重载,因为ostream类已经被封装好了。

  2)不能在Complex类中对"<<"重载,否则*this对象会混淆。

class Complex
{
    public:
        int a,b;
};

ostream &operator<<(ostream &os, Complex &x){  //cout<<x<<endl;
    os<<x.a<<"+i"<<x.b;
    // the "os<<x.a" is os.operator<<(x.a);
    // and in the definition of os.operator<<(), it should returned *this
    // which represents a ostream object
    return os;
}      
时间: 2024-12-28 10:53:43

流插入运算符为什么要被重载为全局函数?的相关文章

C++重载流插入运算符和流提取运算符

C++的流插入运算符“<<”和流提取运算符“>>”是C++在类库中提供的,所有C++编译系统都在类库中提供输入流类istream和输出流类ostream.cin和cout分别是istream类和ostream类的对象.在类库提供的头文件中已经对“<<”和“>>”进行了重载,使之作为流插入运算符和流提取运算符,能用来输出和输入C++标准类型的数据.因此,凡是用“cout<<”和“cin>>”对标准类型数据进行输入输出的,都要用#incl

C++的流插入运算符“&lt;&lt;”和流提取运算符“&gt;&gt;”的重载

C++的流插入运算符"<<"和流提取运算符">>"是C++在类库中提供的,所有C++编译系统都在类库中提供输入流类istream和输出流类ostream.cin和cout分别是istream类和ostream类的对象.在类库提供的头文件中已经对"<<"和">>"进行了重载,使之作为流插入运算符和流提取运算符,能用来输出和输入C++标准类型的数据.因此,凡是用"cout&

C++ 流插入&quot;&lt;&lt;&quot;和流提取&quot;&gt;&gt;&quot;运算符的重载

01 流插入<<运算符的重载 C++ 在输出内容时,最常用的方式: std::cout << 1 <<"hello"; 问题: 那这条语句为什么能成立呢? cout 是什么?"<<" 运算符能用在 cout 上呢? 原因: 实际上,cout 是在 iostream 头文件中定义的 ostream 类的对象. "<<" 能够用在 cout 上是因为,在 ostream 类对 "&

理解-加号重载要使用全局函数+返回值非引用

一.C++中的加号重载使用全局函数的一个有点是可以使用级联的方式进行加法操作. Fraction a,b,c,d,e; A=b+c+d+e; 若为成员函数 1.返回的b的this指针分别作用于后面的变量,因此是对b的修改: 2.如果返回一个新的变量,上面的级联的问题似乎可以解决. 3.问题在于如果存在隐式类型转换,且第一个参数为需要转化的类型时,可能找不到该定义的成员函数,因此使用全局的方式可以便面这个问题 二.返回值需要时一个值,而不是引用 从一个局部函数返回引用,可以考虑两种情况. 1.如果

C++学习27 用全局函数重载运算符

运算符重载函数既可以声明为类的成员函数,也可以声明为所有类之外的全局函数. 运算符重载函数作为类的成员函数 将运算符重载函数声明为类的成员函数时,二元运算符的参数只有一个,一元运算符不需要参数.之所以少一个参数,是因为这个参数是隐含的. 例如,上节的 complex 类中重载了加法运算符: complex operator+(const complex & A)const; 当执行: c3 = c1 + c2; 会被转换为: c3 = c1.operator+(c2); 通过 this 指针隐式

C++运算符重载(成员函数方式)

一.运算符重载 C++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作.如果将C++中这些现存的运算符直接作用于用户自定义的类型数据上,会得到什么样的结果呢?编译器无法给出正常的结果,因为我们需要运算符重载,给运算符赋予多重含义,使同一个运算符作用于不同类型的数据导致不同类型的行为,增强了运算符的普适性. 运算符重载的实质是函数重载.在实现过程中,首先把指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型

C++运算符重载(友元函数方式)

我们知道,C++中的运算符重载有两种形式:①重载为类的成员函数(见C++运算符重载(成员函数方式)),②重载为类的友元函数. 当重载友元函数时,将没有隐含的参数this指针.这样,对双目运算符,友元函数有2个参数,对单目运算符,友元函数有一个参数.但是,有些运行符不能重载为友元函数,它们是:=,(),[]和->. 重载为友元函数的运算符重载函数的定义格式如下: [cpp] view plaincopy 一.程序实例 [cpp] view plaincopy 1 //运算符重载:友元函数方式 2

初探C++运算符重载学习笔记&amp;lt;2&amp;gt; 重载为友元函数

初探C++运算符重载学习笔记 在上面那篇博客中,写了将运算符重载为普通函数或类的成员函数这两种情况. 以下的两种情况发生.则我们须要将运算符重载为类的友元函数 <1>成员函数不能满足要求 <2>普通函数又不能訪问类的私有成员时 举例说明: class Complex{ double real, imag; public: Complex(double r, double i):real(r), imag(i){ }; Complex operator+(double r); };

运算符重载为友元函数,或者普通函数

重载为友元函数时,一般先在类内用friend关键字声明,然后在类外具体实现(具体实现时不需friend,也不需类名) 重载为普通函数时,直接在类外给出函数实现即可(也不需要类名): 二者的区别在于友元函数对类的数据成员有直接获取权限,而普通函数还要通过类的接口访问数据成员. 还有一种是运算符重载为类的成员函数.同友元类似,成员也有直接访问私有数据成员的权限. 那么什么时候重载为成员,什么时候重载为友元呢?