运营商的“返回值”如何>> istream类的工作?

时间:2010-12-26 08:20:03

标签: c++

我试图理解这句话:

    int main() {
        fstream inf( "ex.txt", ios::in );
        char c;
        while( inf >> c ) {
            cout << c << ", ";
        }
        return 0;
    }

inf >> c)在上面的while循环中返回什么?我下载了gcc源代码并尝试使用它,但这对我来说太复杂了:(。

我检查了C ++参考页面,我意识到它会返回对自身的引用:

    istream& operator>> (bool& val );
    istream& operator>> (short& val );
    istream& operator>> (unsigned short& val );
    istream& operator>> (int& val );
    istream& operator>> (unsigned int& val );
    istream& operator>> (long& val );
    istream& operator>> (unsigned long& val );
    istream& operator>> (float& val );
    istream& operator>> (double& val );
    istream& operator>> (long double& val );
    istream& operator>> (void*& val );

    istream& operator>> (streambuf* sb );

    istream& operator>> (istream& ( *pf )(istream&));
    istream& operator>> (ios& ( *pf )(ios&));
    istream& operator>> (ios_base& ( *pf )(ios_base&));

    *** the following functions are not members but GLOBAL functions:

    istream& operator>> (istream& is, char& ch );
    istream& operator>> (istream& is, signed char& ch );
    istream& operator>> (istream& is, unsigned char& ch );

    istream& operator>> (istream& is, char* str );
    istream& operator>> (istream& is, signed char* str );
    istream& operator>> (istream& is, unsigned char* str );

所以我创建了一个类似的类,让我们说my_istream:

struct my_istream {
    my_istream& self_ref;
};

int main() {
    my_istream mis;
}

编译时,我收到了这个错误:

1>c:\users\chan\documents\visual studio 2010\projects\topcoder\topcoder\main.cpp(26): error C2758: 'my_istream::self_ref' : must be initialized in constructor base/member initializer list

但是,我真的不知道在这种情况下应该将self_ref初始化为什么?在处理链表时我理解了一个指向自身的指针,我理解C ++中的引用(&)只是C语言中伪装的指针形式。但是我无法解释这种情况? istream的内部实施如何实际运作?如何将引用评估为真或假?谢谢!

修改

struct my_istream {
    my_istream() {
    }

    my_istream& operator >>( int x ) {
        return *this;
    }
};

int main() {
    my_istream mis;
    int x;
    while( mis.operator>>( x ) ) {
        cout << "--";
    }
}

我应该在my_istream类中添加什么才能在while循环中工作?

2 个答案:

答案 0 :(得分:2)

要返回自我引用,您只需return *this。您实际上并未声明内部自引用。您可以拥有引用成员,但您必须在构造函数初始化列表中初始化它们:class Foo { Foo(int& some_int_ref) :my_ref_member(some_int_ref)

istream有另一个重载来确定它的布尔值。

可链接成员的示例(如operator >>,但在这种情况下只是一个普通的函数)并给一个类一个布尔值(尽管后者是一个值得它自己主题的复杂主题):

#include <iostream>

class X {
    bool B;
public:
    X() :B(false) { }
    X& toggle() { B = !B; return *this; }
    operator void*() { return B ? this : 0; }
};

int main()
{
    X x;

    x.toggle().toggle().toggle();
    if (x)
        std::cout << "true!" << std::endl;
}

编辑:我不想在这个答案中深入研究operator bool vs operator void *,但是这个旧的stackoverflow问题应该会给你很好的参考:Why is "operator bool()" invoked when I cast to "long"?

答案 1 :(得分:1)

  

(inf&gt;&gt; c)在上面的while循环中返回什么?

void*。循环测试解析为while (inf.operator void*() != NULL)

  

如何将引用评估为true或false?

但支持转换为bool或可转换为bool的东西。

  

istream的内部实现如何实际起作用?

它只返回对自身的引用(return *this),因此它可以支持链接。