美文网首页
C++流和类型转换详解

C++流和类型转换详解

作者: 随波逐流007 | 来源:发表于2016-11-10 11:45 被阅读25次

流插入,流提取运算符重载

流插入运算符<<和流提取运算符>>也可以被用来重载。

我们知道可以使用cout对一个int,string等等类型的数据进行输出,我们却不可以对我们自己定义的一个类的对象进行直接输出,因为我们这个类是没有<<运算符的。

<<运算符是有两个操作数的,它是一个双目运算符,可是为什么我们平时貌似只给了它一个操作数呐?形如cout<

其实它是有两个操作数的,cout也是它的一个操作数,cout是一个在ostream类里面已经定义好了的对象,ostream类还为我们定义好了系统中已经存在的类型的输出,如int,double…..这个对象作为了它的左操作数。显然cout这个对象是不属于我们新声明的类的,但是它又需要作为第一个参数,它是没有办法调用我们这个类的成员函数的,所以只能将<<运算符的重载声明为友元函数。

可以为CTime类定义重载的流插入和流提取运算符。

重载之后就可以直接对CTime对象进行输入和输出:

cout<

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<

{

cout<

return output;

}

2.流输入运算符重载

istream& operator>>(istream& input, CTime& time)

{

cin>>time.m_nHour>>time.m_nMinute>>time.m_nSecond;

return input;

}

在重载完流插入和提取运算符后,我们就可以对该类使用<<输出数据,使用>>输入数据。这样是非常直观的。

cout<

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;

}

类型转换函数在我们的日常使用中是比较少见的,我们这里只是给大家介绍一下如何使用的。大家知道有这种函数就可以了。

原文链接:http://www.maiziedu.com/wiki/cplus/flow/

相关文章

网友评论

      本文标题:C++流和类型转换详解

      本文链接:https://www.haomeiwen.com/subject/ahfxpttx.html