C++流和类型转换详解

来源:互联网 发布:mac的maven仓库地址 编辑:程序博客网 时间:2024/06/06 09:22

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

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

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

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

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

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

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

cout<<time;

cin>>time;

  前面一节我们在介绍运算符重载的规则时介绍过,重载流插入和提取运算符的运算符函数,不能作为类的成员函数,只能作为普通函数。

<<>>重载的函数声明如下:

ostream& operator<<(ostream& output, CTime& time);

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

istreamostream分别是输入流类和输出流类。cincout就分别是istreamostream的对象。

  重载<<流插入运算符的函数第一个参数和返回类型必须是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;

}

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

 

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

0 0
原创粉丝点击