链接operator <<和operator ++的问题

时间:2019-09-10 17:30:34

标签: c++ c++11 output operator-overloading increment

我正在学习C ++,但遇到了这个问题:

#include <iostream>
using namespace std;


class test
{
    public:
    test(){};
    test(int i):var{i}{};

    test& operator++(){++var; return this;}  
    test  operator++(int dummy){test tmp =*this;var++;return tmp;}

    friend ostream& operator<<(ostream&, const test&);


   private:
   int var;
};

ostream& operator<<(ostream& o, const test& obj)
{
    o<<obj.var;
    return o;
}


int main()
{
    test obj{2};
    cout << obj << endl;
    obj++;
    cout << obj << endl;
    cout << obj <<' '<< ++obj<<endl;

    return 0;
}

我期望的输出是: 2 3 3 4

相反,我有: 2 3 4 4

如果我用obj ++替换最后一个增量++ obj,情况将更加奇怪: 2 3 4 3

这就像以相反的方式读取流,您能帮我吗?

2 个答案:

答案 0 :(得分:3)

让我们检查一下线路

cout << obj << ' ' << ++obj << endl;

已翻译。

第1步。

cout << obj

成为

// A non-member function.
operator<<(cout, obj)

第2步。

operator<<(cout, obj) << ' '

成为

// Also a non-member function.
operator<<(operator<<(cout, obj), ' ')

第3步。

operator<<(operator<<(cout, obj), ' ') << ++obj

成为

// Also a non-member function.
operator<<(operator<<(operator<<(cout, obj), ' '), ++obj)

第4步。

operator<<(operator<<(operator<<(cout, obj), ' '), ++obj) << endl;

成为

// A member function.
operator<<(operator<<(operator<<(cout, obj), ' '), ++obj).operator<<(endl);

那是整行。

在这样的表达式中,不能保证operator<<(cout, obj)会在++obj之前执行。看来在您的平台中,++obj在执行operator<<(cout, obj)之前已执行。这说明了行为。

请注意,标准已更改。如果您能够使用C ++ 17,则将获得预期的行为。

答案 1 :(得分:0)

对于初学者来说,如果使用默认构造函数,则数据成员i可以未初始化。

像这样声明数据成员

int var = 0;

或者例如通过使用委托构造器来重新定义默认构造器。

library(rvest)
library(httr)

ua <- user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36")
url <- 'https://www.hockey-reference.com/boxscores/199511210BOS.html'
session <- html_session(url,ua)

session %>%
    html_nodes("table") %>%
    html_table()

预增量运算符应该看起来像

class test
{
    public:
    test() : test( 0 ){};
    test(int i):var{i}{};
    // ...

在后递增运算符中,未使用标识符test& operator++(){++var; return *this;} ^^^^^ 。因此将其删除

dummy

此声明

test  operator++( int ){test tmp =*this;var++;return tmp;}

具有未定义的行为,因为读写对象cout << obj <<' '<< ++obj<<endl; 的顺序未排序。

您必须将此语句分为两个语句

obj