我在网上阅读了一些文档,发现istream
类早在string
类添加之前就已经是C++
的一部分了。因此,istream
设计识别基本的C++
类型,如double
和int
,但对string
类型一无所知。因此,有处理double
、int
等基本类型的istream
类方法,而没有处理string
对象的istream
类方法。
我的问题是,如果没有istream
类方法来处理string
对象,为什么这个程序工作,以及如何?
#include <iostream>
int main(void)
{
std::string str;
std::cin >> str;
std::cout << str << std::endl;
return 0;
}
可以使用操作符重载. 如下面的例子所示,您可以创建自己的类并重载operator>>
和operator<<
。
#include <iostream>
class Number
{
//overload operator<< so that we can use std::cout<<
friend std::ostream& operator<<(std::ostream &os, const Number& num);
//overload operator>> so that we can use std::cin>>
friend std::istream &operator>>(std::istream &is, Number &obj);
int m_value = 0;
public:
Number(int value = 0);
};
Number::Number(int value): m_value(value)
{
}
std::ostream& operator<<(std::ostream &os, const Number& num)
{
os << num.m_value;
return os;
}
std::istream &operator>>(std::istream &is, Number &obj)
{
is >> obj.m_value;
if (is) // check that the inputs succeeded
{
;//do something
}
else
{
obj = Number(); // input failed: give the object the default state
}
return is;
}
int main()
{
Number a{ 10 };
std::cout << a << std::endl; //this will print 10
std::cin >> a; //this will take input from user
std::cout << a << std::endl; //this will print whatever number (m_value) the user entered above
return 0;
}
通过重载operator>>
和operator<<
,这允许我们在上面的程序中编写std::cin >> a
和std::cout << a
。
Number
类类似,std::string
类也使用操作符重载。特别是,std::string
重载operator>>
和operator<<
,允许我们编写std::cin >> str
和std::cout << str
,就像您在示例中所做的那样。
因为std::string
重载了>>
和<<
运算符,返回类型为std::istream
和std::ostream
他们如何重载它,你可以看看Mat给出的这个链接。
也可以创建自己的类和重载操作符。下面是一个例子:
class MyClass
{
int numberOne;
double numberTwo;
public:
friend std::ostream& operator<<(std::ostream &out, const MyClass& myClass);
friend std::istream& operator>> (std::istream& in, MyClass& myClass);
};
// Since operator<< is a friend of the MyClass class, we can access MyClass's members directly.
std::ostream& operator<<(std::ostream &out, const MyClass& myClass)
{
out << myClass.numberOne << ' ' << myClass.numberTwo;
return os;
}
// Since operator>> is a friend of the MyClass class, we can access MyClass's members directly.
std::istream& operator>> (std::istream& in, MyClass& myClass)
{
in >> myClass.numberOne;
in >> myClass.numberTwo;
return in;
}
int main()
{
MyClass myClass;
std::cin >> myClass;
std::cout << myClass;
}
由于操作符重载。
在您的示例中,包括<iostream>
将包括<string>
,它是std::basic_string
的专门化。std::basic_string
定义了非成员函数operator<<
和operator>>
。
operator<<
和operator>>
为您自己的自定义类型。