为什么插入/提取操作符的重载函数需要ostream / istream参数?

时间:2017-10-13 05:27:52

标签: c++ oop operator-overloading

考虑以下代码,重载插入&提取算子。

#include <iostream>

using namespace std;

class CTest
{
    string d_name;
public:
    friend ostream & operator<<(ostream & out, CTest & test);
    friend istream & operator>>(istream & in, CTest & test);
};

ostream & operator<<(ostream & out, CTest & test)
{
    out << "Name: " << test.d_name;
    return out;
}

istream & operator>>(istream & in, CTest & test)
{
    cout << "Enter your name: ";
    string name;
    if(in >> name)
        test.d_name = name;

    return in;
}

int main()
{
    CTest test;
    cin >> test;   // (1)
    cout << test;  // (2)
}

关于这个问题,论证ostream&amp; amp;的重要性是什么? out and istream&amp;在? 由于我们只能看到一个参数(cin&gt;&gt; test或cout&lt;&lt; test),调用者中的哪个是在(1)或(2)传递的ostream / istream引用?

3 个答案:

答案 0 :(得分:2)

因为在cin >> testcout << test中都存在两个参数。

cin的类型为istream

cout的类型为ostream

这些类型可能是除coutcin之外的其他内容。例如,它们可以是cerrclogstringstream

这就是为什么你需要两个参数,因为一个是流的变量而另一个是要流式传输的对象。

答案 1 :(得分:0)

cin >> test;

此处,左操作数是cin类型的std::istream对象,右操作数是您的CTest类对象。

>>运算符的原型

friend istream& operator >> (istream& s, Your class &);

所以,在内部我们已经传递了两个参数。

答案 2 :(得分:0)

为了更好地理解两个参数的来源,您可以按如下方式重写main()函数:

int main()
{
    CTest test;
    operator>>(std::cin, test);
    operator<<(std::cout, test);
}