流插入,流提取运算符重载
流插入运算符<<和流提取运算符>>也可以被用来重载。
我们知道可以使用cout对一个int,string等等类型的数据进行输出,我们却不可以对我们自己定义的一个类的对象进行直接输出,因为我们这个类是没有<<运算符的。
<<运算符是有两个操作数的,它是一个双目运算符,可是为什么我们平时貌似只给了它一个操作数呐?形如cout<<a;我们只知道a是一个变量,是它的一个操作数,还有一个操作数呐?
其实它是有两个操作数的,cout也是它的一个操作数,cout是一个在ostream类里面已经定义好了的对象,ostream类还为我们定义好了系统中已经存在的类型的输出,如int,double…..这个对象作为了它的左操作数。显然cout这个对象是不属于我们新声明的类的,但是它又需要作为第一个参数,它是没有办法调用我们这个类的成员函数的,所以只能将<<运算符的重载声明为友元函数。
可以为CTime类定义重载的流插入和流提取运算符。
重载之后就可以直接对CTime对象进行输入和输出:
cout<<time;
cin>>time;
前面一节我们在介绍运算符重载的规则时介绍过,重载流插入和提取运算符的运算符函数,不能作为类的成员函数,只能作为普通函数。
<<和>>重载的函数声明如下:
ostream& operator<<(ostream& output, CTime& time);
istream& operator>> (istream& input, CTime& time);
istream和ostream分别是输入流类和输出流类。cin和cout就分别是istream和ostream的对象。
重载<<流插入运算符的函数第一个参数和返回类型必须是ostream&类型。
重载>>流提取运算符的函数第一个参数和返回类型必须是istream&类型。
1.流提取运算符重载
ostream& operator<<(ostream& output, CTime& time) //返回ostream类的对象output的引用是为了实现连续输出,如cout<<a<<b;
{
cout<<time.getHour()<<time.getMinute()<<time.getSecond()<<endl;
return output;
}
2.流输入运算符重载
istream& operator>>(istream& input, CTime& time)
{
cin>>time.m_nHour>>time.m_nMinute>>time.m_nSecond;
return input;
}
在重载完流插入和提取运算符后,我们就可以对该类使用<<输出数据,使用>>输入数据。这样是非常直观的。
cout<<time; //在我们重载了输入输出运算符之后,我们也可以像C++里面预定义好的数据类型一样对这个类的对象进行输入输出
operator<<(cout, time);
cin>>time;
operator>>(cin, time);
类型转换
1.使用构造函数进行类型转换
在为CTime类重载+运算符后,我们就可以对两个CTime对象使用+运算符进行操作。但仍然不能使用+运算符将一个CTime对象和一个int类型相加。为了实现它,我们可以先将int类型转换为一个CTime的临时对象,然后在进行相加。如下:time + CTime(2)。
CTime(2)这种形式很类似于强制类型转换,将int类型转换为CTime类型。之所以可以进行此种转换,是因为我们已经为CTime对象定义了具有一个int类型参数的构造函数。因此具有一个参数的构造函数可以用来做类型转换,称之为转换构造函数。
有了类型转换函数,在需要CTime类型参数的地方可以使用int类型代替。
在下面①和②两种情况中,因为这个类我们定义了只有一个参数的构造函数,所以在需要一个CTime对象,而我们输入的是一个int类型的参数时,系统就会为我们转换成下面箭头所指向的格式,将一个int类型的参数利用转换构造函数转换成CTime类的对象,如果我们期望避免这种转换,我们可以在含有一个参数的构造函数前面加上声明explicit,如explicit CTime(int value);加上声明之后,下面的转换语句就会报错了。
关于自动类型转换具有许多争议性,很多人觉得它不安全,因为它自动地执行了一些动作,也有人认为它很方便,因为它不需要我们手动的去创建一个对象。
2.类型转换函数进行类型转换
类型转换函数用以将类的对象转换另一种数据类型的函数。类型转换函数没有参数,没有返回类型。它是成员函数。
如可以将CTime类对象转换int类型。
int nSecond = time; //执行了将对象转换为int类型的操作,调用类型转换函数
类型转换函数的声明形式:
operator int() //int为它的返回类型
下面我们定义一个类型转换函数:
CTime::operator int() //将一个CTime类的对象转换成秒数
{
return m_nHour * 60 * 60 + m_nMinute * 60 + m_nSecond;
}
类型转换函数在我们的日常使用中是比较少见的,我们这里只是给大家介绍一下如何使用的。大家知道有这种函数就可以了。