C++重载输入流、输出流运算符(非友元方式重载)

       在c++中类的私有成员是不能被直接访问的,需要通过类中提供的成员函数简介的操作这些数据。同时C++ 能够使用流提取运算符 >> 和流插入运算符 << 来输入和输出内置的数据类型。可以重载流提取运算符和流插入运算符来操作对象等用户自定义的数据类型。

       但是如果直接在类内部直接重载输入、输出流运算符,那么在使用时只能通过Obj>>cin //相当于 Obj.operator>>(cin)

或是Obj<<cout//相当于 Obj.operator<<(cout) 的方式调用,但这种方式不太习惯于我们平时的操作方式,所以很多人通过用友元去实现此类重载。

例如:C++ 输入/输出运算符重载——菜鸟教程

       用友元的方式有利有弊,通常它可以在较为频繁访问类私有成员时代替调用函数成员这一步骤,节省一些不必要的调用,减轻代码量提高效率,但同时它也破坏了内的封装性,不安全。

       所以,我这里没有采取友元的方式去重载,而是通过在类外新实现了一种方法,在函数内部实现这一过程,而留给用户的接口任然是以前得读写习惯,代码如下:

class Date
{
private:
	int year;
	int month;
	int day;
public:
	Date() {}
	~Date() {}
	
	istream & operator>>(istream &in)
	{
		in>>year>>month>>day;
		return in;
	}
	ostream & operator<<(ostream &out) const
	{
		out<<year<<" "<<month<<" "<<day<<" ";
		return out;
	}
};


istream& operator>>(istream& in, Date& date)
{
	// date.operator>>(in); 调用date的成员函数
	date >> in;
	return in;
}

ostream& operator<<(ostream& out, const Date& date)
{
	// date.operator<<(out); 调用date的成员函数
	date << out;
	return out;
}

分析:

       在类的内部重载输出流与输入流运算符,他们的调用逻辑是 对象.调用函数(输出/输出流) 。通过对象调用自身的函数,把输入流或输出流当做参数调用。因此,我们在进行输入或输出的操作时不得不使用如下的方式:

int main()
{
	Date date;
	date.operator>>(cin);	// 输入
	date.operator<<(cout);	// 输出
	return 0;
}

       这样的语法很不直观,也不符合我们的代码编写逻辑,因此我们可以考虑增加一个中间层来解决。具体的,我们可以编写一个函数,让此函数帮我们调用输入输出。这个中间层函数无疑是符合我们书写习惯的语法逻辑,而我们通过该函数的调用方式便可简介的完成输入输出操作。

int main()
{
	Date date;
	cin >> date;	// 输入
	cout << date;	// 输出
	return 0;
}

       此外,为了提高函数的调用效率,我们可以将此中间层函数设计成内联的(inline)。

 

扩展:

       类似的还有 operator+、operator- 等函数重载方式,在类中重载这些函数后,只能通过类对象在前,参数在后的调用方式。例如:

class Int
{
private:
	int mval;
public:
	Int(int v = 0) :mval(v) {}
	// 重载 operator+
	Int operator+(const Int& rhs) const 
	{
		return Int(mval + rhs.mval);
	}
	Int operator+(const int val) const 
	{
		return Int(mval + val);
	}
};
Int operator+(const int val, const Int& rhs)
{
	return rhs + val;
}

int main()
{
	Int it1(10);
	Int it2(20);
	int ix = 30;

	Int re1 = it1 + it2;	// 对象+对象
	Int re2 = it1 + ix;		// 对象+整数
	Int re3 = ix + it1;		// 整数+对象

	return 0;
}

我们在类中重载了对象之间的 operator+,对象与整数之间的 operator+,在类外通过一个中间函数实现了 整数与对象之间的 operator+ 。

  • 14
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
输入输出运算符重载C++中的一种特性,它允许我们自定义类对象在输入输出中的行为。通过重载输入输出运算符,我们可以实现自定义的对象输入输出格式。 在C++中,输入输出运算符重载使用友元函数来实现。常用的输入输出运算符包括插入运算符(<<)和提取运算符(>>)。 对于输出运算符(<<),我们可以通过重载运算符来定义对象在输出中的输出格式。例如,我们可以重载运算符输出对象的成员变量值。 对于输入运算符(>>),我们可以通过重载运算符来定义对象在输入中的输入格式。例如,我们可以重载运算符来接收用户输入,并将输入的值赋给对象的成员变量。 下面是一个示例代码,演示了如何重载输入输出运算符: ```cpp #include <iostream> class MyClass { private: int value; public: MyClass(int v) : value(v) {} // 重载插入运算符(<<) friend std::ostream& operator<<(std::ostream& os, const MyClass& obj) { os << "Value: " << obj.value; return os; } // 重载提取运算符(>>) friend std::istream& operator>>(std::istream& is, MyClass& obj) { is >> obj.value; return is; } }; int main() { MyClass obj(0); std::cout << "请输入一个整数: "; std::cin >> obj; std::cout << "输入的值为: " << obj << std::endl; return 0; } ``` 在上述示例中,我们定义了一个名为MyClass的类,其中包含一个私有成员变量value。通过重载插入运算符(<<)和提取运算符(>>),我们可以自定义MyClass对象在输入输出中的行为。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我叫RT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值