它是如何工作的?
struct Person
{
std::string name;
std::string address;
};
std::istream &read(std::istream &is, Person &person)
{
is>> person.name;
getline(is, person.address);
return is;
}
int main()
{
Person p;
read(cin,p);
}
Run Code Online (Sandbox Code Playgroud)
怎么return is回归两者person.name 和person.address一起getline似乎是分开的is?
该函数返回单个值,它不能返回更多.在这种情况下,它通过引用返回它作为第一个参数获得的流,也通过引用返回.不返回此人的姓名和地址,从流中读取它们并用于填充通过引用收到的Person实例p.
// notice both parameters are references
std::istream &read(std::istream &is, Person &person)
{
is >> person.name; // read the name and store it in the person object
getline(is, person.address); // read the address and store it in the person object
return is; // return the stream reference
}
int main()
{
Person p;
read(cin,p); // both params are sent by reference
// so here the object p will have it's members properly filled
}
Run Code Online (Sandbox Code Playgroud)
read()在这种情况下,就像对函数一样,通过引用返回流没有多大意义.这通常用于重载流的运算符,例如:
std::istream& operator >>(std::istream &is, Person &person)
{
is >> person.name;
is >> person.address;
return is;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,返回流非常有用,因为这样可以链接多个调用,例如:
Person p1, p2, p3;
std::cin >> p1 >> p2 >> p3;
Run Code Online (Sandbox Code Playgroud)
在你的情况下,这不是真的有用,如果你链接调用它实际上会损害可读性:
Person p1, p2, p3;
read(read(read(cin, p1), p2), p3);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果您这样做,写入和读取都会容易得多:
Person p1, p2, p3;
read(cin, p1);
read(cin, p2);
read(cin, p3);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
130 次 |
| 最近记录: |