首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >链接operator<<和operator++的问题

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

Stack Overflow用户
提问于 2019-09-11 01:30:35
回答 2查看 111关注 0票数 1

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

代码语言:javascript
复制
#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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-11 01:36:15

让我们来看看这条线是如何

代码语言:javascript
复制
cout << obj << ' ' << ++obj << endl;

是被翻译的。

第1步。

代码语言:javascript
复制
cout << obj

变成了

代码语言:javascript
复制
// A non-member function.
operator<<(cout, obj)

第2步。

代码语言:javascript
复制
operator<<(cout, obj) << ' '

变成了

代码语言:javascript
复制
// Also a non-member function.
operator<<(operator<<(cout, obj), ' ')

第3步。

代码语言:javascript
复制
operator<<(operator<<(cout, obj), ' ') << ++obj

变成了

代码语言:javascript
复制
// Also a non-member function.
operator<<(operator<<(operator<<(cout, obj), ' '), ++obj)

第4步。

代码语言:javascript
复制
operator<<(operator<<(operator<<(cout, obj), ' '), ++obj) << endl;

变成了

代码语言:javascript
复制
// A member function.
operator<<(operator<<(operator<<(cout, obj), ' '), ++obj).operator<<(endl);

这就是整条线。

在这样的表达式中,不能保证在++obj之前执行operator<<(cout, obj)。在您的平台中,似乎在执行operator<<(cout, obj)之前先执行++obj。这就解释了这种行为。

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

票数 3
EN

Stack Overflow用户

发布于 2019-09-11 01:38:54

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

可以像这样声明数据成员

int var = 0;

或者重新定义默认构造函数,例如使用委托构造函数。

代码语言:javascript
复制
class test
{
    public:
    test() : test( 0 ){};
    test(int i):var{i}{};
    // ...

预增值运算符应该如下所示

代码语言:javascript
复制
test& operator++(){++var; return *this;}
                                 ^^^^^

在后增量运算符中,不使用标识符dummy。所以把它去掉

代码语言:javascript
复制
test  operator++( int ){test tmp =*this;var++;return tmp;}

这句话

代码语言:javascript
复制
cout << obj <<' '<< ++obj<<endl;

具有未定义的行为,因为读写对象obj是没有顺序的。

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

代码语言:javascript
复制
cout << obj <<' ';
cout << ++obj<<endl;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57875745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档