C++ 运算符重载(二)

关于输入(cin)/输出(cout)的重载。

在C++的头文件中有 #include <iostream> ,实际上就包含着cin/cout,具体上:ostream中对应的是cout,而istream对应的是cin。

我先实现cout重载

#include <iostream>
using namespace std;
class Oc
{
public:
private:
    int cnt;
public:
    Oc( int cnt)
    {
        this->cnt = cnt;
    }
    friend ostream& operator << (ostream& ost , const Oc& oc);
};
ostream& operator << (ostream& ost , const Oc& oc)
{
    ost << oc.cnt;
    return ost;
}
int main()
{
    system("color 5A");
    Oc oc(2);
    cout << oc;
    return 0;
}

运行结果:

解释:

①:  参数 ostream& ost , const Oc& oc 以及返回ostream& 都是使用引用 防止调用拷贝构造

②:  可以使用void返回 , 但是这样无法使用连续的输出 << oc << XXX

③:  左操作数必须是ostream对象,所以此重载必须在类外实现

cin重载:

#include <iostream>
using namespace std;
class Oc
{
private:
    int cnt;
public:
    Oc( int cnt)
    {
        this->cnt = cnt;
    }
    friend istream& operator >>( istream& ist , Oc& oc);
    friend int main();
};
istream& operator >>( istream& ist , Oc& oc)
{
    ist >> oc.cnt;
    if( ist.fail() )
    {
        cout << "fail value to Oc.cnt!" << endl;
        oc.cnt = 0;
    }
    return ist;
}
int main()
{
    system("color 5A");
    Oc oc(2);
    cin >> oc;
    cout << "Oc.cnt value is : " << oc.cnt << endl;
    return 0;
}

①,我先输入正确的值如 1 , 其结果如下:

②,在输入一个错误的值,字符串。结果如下:

ist.fail() 就是用来检测是否是输入失败的。字符串无法给int赋值。所以---

cin和cout一样只能在类外实现

时间: 2024-10-29 10:47:41

C++ 运算符重载(二)的相关文章

c++之运算符重载二

重载++和-- 设  A  Aobject : 运算符 ++和 - - 有两种方式: 前置方式:   ++Aobject  --Aobject 一元  成员函数  重载  A :: A operator++ () ; 解释为:  Aobject . operator ++( ) ; 友元函数  重载  friend A operator++ (A &) ; 解释为:   operator ++( Aobject ) ; 后置方式:  Aobject ++  Aobject 二元  成员函数  重

运算符重载(二)

在<运算符重载(一)>我们介绍了运算符重载的基本概念,以及基本形式.那么再运算符重载中,参数的传递有什么遵循的原则?返回值的类型又遵循什么原则呢?这些问题都 在这一篇文章中回答. (1)运算符重载函数中的参数个数应该有几个 运算符重载函数的参数个数取决于两个因素.一是运算符是一元运算符还是二元运算符,二是采用友元函数重载还是采用成员函数重载 如果是一元运算符,采用友元函数重载就要有一个参数,采用成员函数重载,就不需要参数(因为成员函数隐式的传递了this指针) 1 class Integer{

第八周项目 二 【项目2-Time类中的运算符重载】

[项目2-Time类中的运算符重载] 实现Time类中的运算符重载. [cpp] view plaincopyprint? class CTime { private: unsigned short int hour;    // 时 unsigned short int minute;  // 分 unsigned short int second;  // 秒 public: CTime(int h=0,int m=0,int s=0); void setTime(int h,int m,i

sdut 面向对象程序设计上机练习十二(运算符重载)

面向对象程序设计上机练习十二(运算符重载) Time Limit: 1000MS Memory limit: 65536K 题目描述 处理一个复数与一个double数相加的运算,结果存放在一个double型变量d1中,输出d1的值.定义Complex(复数)类,在成员函数中包含重载类型转换运算符:operator double(){return real;} 输入 输入占两行: 第1行是一个复数的实部和虚部,数据以空格分开. 第2行是一个实数. 输出 输出占一行,复数的实部和实数之和,小数点后保

第九周项目二-Time类中的运算符重载(续)

<span style="color: rgb(85, 85, 85); font-family: 'microsoft yahei'; font-size: 15px; line-height: 35px;">在Time类中的运算符重载基础上</span><br style="color: rgb(85, 85, 85); font-family: 'microsoft yahei'; font-size: 15px; line-height:

第九周 项目二-Time类中的运算符重载(续)

在Time类中的运算符重载基础上 (1)定义对时间对象的自增和自减一目运算符 //一目运算符的重载 CTime operator++(int);//后置++,下一秒 CTime operator++();//前置++,下一秒,前置与后置返回值不一样 CTime operator--( int);//后置--,前一秒 CTime operator--();//前置--,前一秒 (2)定义Time类中的<<和>>运算符重载,实现时间的输入输出,改造原程序中对运算结果显示方式,使程序读起

第八周项目二-Time类中的运算符重载

实现Time类中的运算符重载 class CTime { private: unsigned short int hour; // 时 unsigned short int minute; // 分 unsigned short int second; // 秒 public: CTime(int h=0,int m=0,int s=0); void setTime(int h,int m,int s); void display(); //二目的比较运算符重载 bool operator >

c#语法基础(二)——运算符重载

c#允许用户定义的类型,通过使用operator关键字定义静态成员函数来重载运算符 下面来看一个例子: public class ComplexNumber { private int real; private int imaginary; //构造器 public ComplexNumber(int r, int i) { real = r; imaginary = i; } //重载ToString方法,用来显示ComplexNumber public override string To

关于c++的运算符重载那些事

搞c++有一段时间了,今天突然要重载一个运算符,发现自己有点忘了,遂查查资料做一下c++运算符重载的小总结. 一.何为运算符重载 运算符的重载是c++语言特有的,java什么的是没有运算符重载的,所以运算符重载在笔试面试中有可能成为c++的高频考点.运算符重载就是重新定义运算符的意义,如常用的+,-,×,÷都是可以重载的.运算符重载使用的是关键字operator,表现形式是:                                                            

【C++】运算符重载

这是C++的特色,也是C++比较难的一个基本语法,但是,如果你把运算符重载看成一个特殊的类方法,且这个类方法的名称就是运算符,一切就变得简单了. 下面用一个简单的程序说明这个问题: 声明两个3x3二维矩阵a,b,其实就是Matrix类,里面就用私有的长度为9的一维数组存储数据.只是打印的时候,打成二维数组的样子 实现~a或者~b就能直接打印a与b,也就是~相当于把a,b打印出来,此乃单目运算符重载. 实现a+b,返回另一个相加之后的矩阵c. 也就是说做到如下图的效果: 代码如下: #includ