0

オーバーロード出力演算子を含む次のコードがあります。

class Student 
{
public:
    string name;
    int age;
    Student():name("abc"), age(20){}
    friend ostream& operator<<(ostream&, const Student&);
};
ostream& operator<<(ostream& os, const Student& s)
{
    os << s.name; // Line 1
    return os;
}

これに変更した場合の違いは何だろうと思っていましたLine 1cout << s.name

4

2 に答える 2

4

次に、operator <<生徒の名前を任意のストリームに出力できることを宣伝しますが、そのパラメーターを無視し、常に標準出力に出力します。類推として、それは書くことに似ています

int multiplyByTwo(int number) {
    return 4;
}

これは間違いなく問題であることがわかります。本当に常に 4 を返したい場合は、関数を次のようにする必要があります。

int multiplyTwoByTwo() {
    return 4;
}

もちろん、operator <<引数を 1 つだけ取ることはできません。これは 2 項演算子であるため、ここで類推が崩れますが、全体像はわかります。

于 2012-05-07T11:28:03.330 に答える
2

を呼び出すoperator <<のではosなく、を呼び出しますcoutcoutもですがostream、それだけではありません。

たとえば、ファイルに出力する場合は、が必要ですfstream。そして、あなたは書く

fstream fs;
Student s;
fs << s;

出力はファイルに出力されませんが、に出力されますcout。これは必要なものではありません。

「Studentを好きな人に出力できますが、ostreamそれでもコンソールに出力されます」と言っているようなものです。

于 2012-05-07T11:27:44.527 に答える