首页 > 其他分享 >重载输入输出运算符<< 学习

重载输入输出运算符<< 学习

时间:2024-01-01 18:11:27浏览次数:25  
标签:cout person 成员 输入输出 运算符 operator 操作符 重载

转自:https://developer.aliyun.com/article/297612,https://blog.csdn.net/My_heart_/article/details/51534624

1.介绍

cin和cout分别是istream类和ostream类的对象,在类库提供的头文件中已经对这两个类的“<<”和“>>”进行了重载。

若自定义的类要使用<</>>作为输入或输出,需要重载:

    istream & operator >> (istream &, 自定义类 &);// 第一个参数和函数的类型都必须是istream&类型,第二个参数是要进行输入操作的类。都是引用类型。
    ostream & operator << (ostream &, 自定义类 &);// 第一个参数和函数的类型都必须是ostream&类型,第二个参数是要进行输出操作的类。

只能将重载“>>”和“<<”的函数作为友元函数或普通的函数,而不能将它们定义为成员函数。 定义为成员函数需要类是操作符的左输入。

分析cout<<c3; 编译系统把“cout<<c3”解释为 operator<<(cout, c3);以两者为实参调用重载的operator<<函数,并且返回对象对cout的引用。

那么重载函数里的<<实际上是C++自己定义的重载函数:

  • std::cout << 1;语句,等价于cout.operator<<(1);
  • std::cout << 1 <<"hello";语句,等价于( cout.operator<<(1) ).operator<<("hello");

return  output的作用是什么?是为了能连续向输出流插入信息。

2.重载规则

  • 重载为类成员函数还是全局函数?

类成员函数:

class person{
private:
    int age;
public:
    person(int a)
    {
       this->age=a;
    }
   inline bool operator == (const person &ps) const;
};

// 只需要传入右操作数即可,当前类对象是左操作数
inline bool person::operator==(const person &ps) const
{
 
     if (this->age==ps.age)
        return true;
     return false;
}

全局函数:

  1. 如果一个重载操作符是类成员,那么只有当与 它的左操数是该类的对象时,该操作符才会被调用。如果该操作符的左操作数必须是其他的类型,则操作符必须被重载为全局名字空间的成员。

  2.  C++要求赋值=,下标[],调用(), 和成员指向-> 操作符必须被定义为类成员操作符。任何把这些操作符定义为名字空间成员的定义都会被标记为编译时刻错误。

  3.   如果有一个操作数是类类型如string类的情形那么对于对称操作符比如等于操作符最好定义为全局名字空间成员。

 

标签:cout,person,成员,输入输出,运算符,operator,操作符,重载
From: https://www.cnblogs.com/BlueBlueSea/p/17938934

相关文章

  • C++入门-命名空间、引用、函数重载
    引言:C++是C的一个超集,即C++继承了C语言的全部特性。C++不仅包含了C的关键字、语法和语义,还增加了一些新的特性。例如命名空间、引用、函数重载等,本片博客旨在向大家分享C++相较于C语言,增加的一些新的特性。1.命名空间namespace我们知道,在C语言中编写程序时,有时会存在标识符名与标准......
  • 【C/C++】通过下面的工作来改进String类声明(即将String1.h升级为String2.h)。 a. 对+运
    通过下面的工作来改进String类声明(即将String1.h升级为String2.h)。a.对+运算符进行重载,使之可将两个字符串合并成一个。b.提供一个Stringlow()成员函数,将字符串中所有的字母字符转换为小写(别忘了cctype系列字符函数)。c.提供String()成员函数,将字符串中所有字母字符转换成大......
  • Java基础-运算符
    运算符Java语言支持如下运算符:算术运算符:+,-,*,/,%,++,--赋值运算符:=关系运算符:>,<,>=,<=,==,!=instanceof逻辑运算符:&&,||,!位运算符:&,|,^,~,>>,<<,>>>(了解!!!)条件运算符?:拓展赋值运算符:+=,-=,*=,/= packageoperator;​publiccl......
  • python 运算符 列表操作 元组
    可以对字符串进行切片访问(同时适用于字符、列表、元组等)。字符串从左往右,索引从0开始;从右往左,索引从–1开始。可以取字符串中的片段,切片索引按左闭右开原则:var='HelloWorld!'#按索引取部分内容,索引从0开始,左必须小于右#支持字符、列表、元组var[0]#'H'#从右往......
  • C# 范围运算符
    a.. 等效于 a..^0..b 等效于 0..b.. 等效于 0..^0范围运算符表达式说明..集合中的所有值。..end从开头到 end(不含)的值。start..从 start(含)到结尾的值。start..end从 start(含)到 end(不含)的值。^start..从 start(含)到倒计数结尾的值。..^e......
  • 无涯教程-Java泛型 - 不允许 重载
    一个类不允许具有两个在类型擦除后可以具有相同签名的重载方法。classBox{//Compilererror//Erasureofmethodprint(List<String>)//isthesameasanothermethodintypeBoxpublicvoidprint(List<String>stringList){}publicvoidprint(Li......
  • 数据类型转换&表达式&运算符总结
    总结数据类型转换概念:将数据从一种格式或结构转换为另一种格式或结构的过程。作用:节约内存空间将一些类型转换为项目所需要的类型类型转换分类自动隐式转换定义:将小的数据类型转换大的数据类型注意事项:在Java中,boolean类型与所有其他7种类型都不能......
  • Java-继承:重载与重写的区别
    一、重写(Override)子类继承父类,子类重写父类中的所有公共方法,覆盖父类的方法并对其重写。注意事项:重写前后方法名相同;参数列表相同;返回值相同子类重写的方法所抛出的异常必须与父类中的被重写方法的异常一致,或者不能比父类的异常范围更大。父类的私有方法不能被重写,如果子类非要......
  • 数据处理动作——增删改查输入输出-map-flattern-agg-concat-merge
    numpypytorchmindsporeimportnumpyasnpdefzscore(x,axis=None):xmean=x.mean(axis=axis,keepdims=True) xstd=np.std(x,axis=axis,keepdims=True) zscore=(x-xmean)/xstd returnzscore###说明指定如何加,不同软件和框架有默认或者隐式处理 维度-......
  • 牛客OJ在线编程常见输入输出练习
    练习链接:https://www.nowcoder.com/exam/test/76850250/detail?pid=27976983&examPageSource=Search 题目:A+B(4)输入数据包括多组。每组数据一行,每行的第一个整数为整数的个数n(1<=n<=100),n为0的时候结束输入。接下来n个正整数,即需要求和的每个正整数。示例:输入......