为自定义复数类定义类似标准输入输出流iostream的cin cout流类对象并重载《》运算符 探讨iostream流类的::iostate等成员物理意义

// iostream iofstream iostringstream.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <istream>
#include <ostream>
#include <iostream>
#include <typeinfo>
class complex
{
public:
	double real;
	double imag;
};
class ciostream 
{ //自定义重载了复数complex类型的控制台窗口IO流 纯操作流 无数据 读取输出控制台窗口 
public:
	ciostream& operator>>(complex& obj)
	{
		std::cin>>obj.real>>obj.imag;
		return *this;
	};
	ciostream& operator<<(complex& obj)
	{
		std::cout<<obj.real<<(obj.imag>0?"  +":"  -")<<abs(obj.imag)<<'i'<<"和";
		return *this;
	};
};
int _tmain(int argc, _TCHAR* argv[])
{
	ciostream cin,cout;
	complex c1,c2;
	/*cin>>c1>>c2;
	cout<<c1<<c2;*/
	enum myenum{ first=1,second,third};
	int a;
	//decltype(std::cin) mycin; //编译错 类std::basic_istream不存在默认构造函数
	std::cin>>a;
	while(1){
		std::istream::iostate; //前一个::用于访问名字空间std中的istream这个类型名 
		          //后一个::用于访问istream类的iostate成员 是一种类内部定义的枚举类型名
		const type_info& t0=typeid(std::istream::iostate);
		std::cout<<t0.name()<<std::endl; //int
		const type_info& t1=typeid(myenum); //枚举类型名
		std::cout<<t1.name()<<std::endl; //?AW4myenum@?1?wmain@
		const type_info& t2=typeid(second); //枚举数据
		std::cout<<t2.name()<<std::endl; //?AW4myenum@?1?wmain@
		const type_info& t=typeid(std::cin.badbit);
		//typeid()返回const type_info类对象并且不能拷贝不能自己构造所以左值必须用const type_info&
		std::cout<<t.name()<<std::endl; //控制台窗口输入'1'时输出enum std::_Iosb<int>::_Iostate
		std::cout<<std::cin.badbit<<std::endl; 
		//^当控制台窗口输入'1'为4 输入"1.2"为4 输入'a'也为4
		std::cout<<std::cin.failbit<<std::endl; //指出一个IO操作失败了
		//^当控制台窗口输入'1'为2 输入"1.2"为2 输入'a'为2
		std::cout<<std::cin.eofbit<<std::endl;
		//^当控制台窗口输入'1'为1 输入"1.2"为1 输入'a'为1
		std::cout<<std::cin.goodbit<<std::endl;
		//^用来指出流未处于错误状态。此值保证为零
		std::cout<<std::cin.eof()<<std::endl;
		//^当控制台窗口输入'1'为0 输入"1.2"为0 输入'a'为0
		//若流对象std::cin的eofbit置位则返回true
		std::cout<<std::cin.fail()<<std::endl;
		//^当控制台窗口输入'1'为0 输入"1.2"为0 输入'a'为1(此时发生置位)
		//若流对象std::cin的failbit或badbit置位则返回true
		std::cout<<std::cin.bad()<<std::endl;
		//^当控制台窗口输入'1'为0 输入"1.2"为0 输入'a'为0
		//若流对象std::cin处于有效状态则返回true
		std::cin.setstate(std::cin.badbit); //将cin流对象中给定的badbit条件状态位复位
		std::cin.clear(); //s.clear()将cin流对象所有条件状态位复位 返回void
		std::cin.rdstate();//返回流std::cin的当前条件状态 返回值类型为std::cin流类::iostate
		break;
		std::cin>>a;
	}
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值