如何在此代码中返回工作?

sae*_*asi 2 c++

它是如何工作的?

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.nameperson.address一起getline似乎是分开的is

Ion*_*nut 6

该函数返回单个值,它不能返回更多.在这种情况下,它通过引用返回它作为第一个参数获得的流,也通过引用返回.不返回此人的姓名和地址,从流中读取它们并用于填充通过引用收到的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)