关于C ++中自定义I / O运算符的问题?

时间:2011-07-05 02:52:30

标签: io operators

我有以下代码:

 class Student {
 public:
     Student(){}
     void display() const{}
     friend istream& operator>>(istream& is, Student& s){return is;}
     friend ostream& operator<<(ostream& os, const Student& s){return os; }
 };
int main()
{
    Student st;
    cin >> st;
    cout << st;

    getch();
    return 0;
}

我在省略friend关键字以使运算符成为Student类的成员函数时尝试了自己,然后编译器将生成“binary 'operator >>' has too many parameters”。我已经阅读了一些文档,说发生这种情况是因为所有成员函数总是收到一个隐含参数“this”(这就是为什么所有成员函数都可以访问私有变量)。 根据这个解释,我尝试了如下:

class Student {
 public:
     Student(){}
     void display() const{}
     istream& operator>>(istream& is){return is;}
     ostream& operator<<(ostream& os){return os; }
 };
int main()
{
    Student st;
    cin >> st;
    cout << st;

    getch();
    return 0;
}

收到错误消息:“error C2679: binary '>>' : no operator found which takes a right-hand operand of type 'Student' (or there is no acceptable conversion)

有人能给我一个明确的解释吗?

2 个答案:

答案 0 :(得分:0)

我忘记了定义运算符的位置,但它可能是全局运算符&gt;&gt;,也可能是属于流的运算符。

在学生中定义它是错误的地方。

答案 1 :(得分:0)

你不能说这个函数是友元函数,然后在线包含函数。 friend关键字表示该函数未在类中定义,但它可以访问该类的所有私有和受保护变量。将您的代码更改为:

class Student {
  public:
    Student(){}
    void display() const{}
    friend istream& operator>>(istream& is, Student& s);
    friend ostream& operator<<(ostream& os, const Student& s);
};

istream& operator >>(istream& is, Student& s) { return is; }
ostream& operator <<(ostream& os, const Student& s) { return os; }

再看http://www.java2s.com/Code/Cpp/Overload/Overloadstreamoperator.htm另一个例子。

使用&lt;&lt;和&gt;&gt;,左手操作数总是一个文件流,所以你不能在实际的类中重载它们(技术上必须进入文件流类)。