文章目录
- 一、前言
- 二、cin是什么?
- 三、隐式类型转化如何发生?
一、前言
在oj题中,为了实现多行输入,我们经常可以看到这样的写法:while(cin >> str)
,这究竟是什么意思呢?为了理解其中的含义,我们首先需要对C++基础IO和运算符重载具有初步的认识。
二、cin是什么?
我们常常使用 cin 从键盘中读取数据,那么首先思考一个问题,cin究竟是什么?其实它并不神秘,因为我们知道C++是面向对象的,cin本质上就是一个类型为 istream
的全局对象。
istream
类中重载了流输入运算符,并且重载了所有的内置类型,因此我们当使用cin输入的时候,从来没有关心过数据的类型:
我们注意到 operator>>
函数的返回值类型为 istream,其实就是将cin返回,这样做的好处是可以进行连续输入,例如:cin >> a >> b
。显然istream
类型不是整形,不能作为while循环的判断条件。因此我们不难反推出,这其中一定发生了隐式类型转化。
三、隐式类型转化如何发生?
这其实也是运算符重载带来的结果。在 istream 类中有一个特殊的运算符重载operator bool()
,它继承自基类 ios,提供一个本类型到bool类型的隐式类型转化。
我们按下 ctrl + z
会从循环中退出,这也正是因为operator bool 被设置,从而返回false导致循环退出。
按照相同的道理,我们还实现本类型到int类型的转化等等,是不是很神奇呢?
class Date
{
public:
Date(int year = 2023, int month = 1, int day = 13)
: year_(year), month_(month), day_(day) {}
// 细节:不要带返回值,重载的类型就是返回值的类型
operator int()
{
return year_ + month_ + day_;
}
private:
int year_;
int month_;
int day_;
};