Problem with chaining operator<< and operator++

后端 未结 2 699
耶瑟儿~
耶瑟儿~ 2021-01-25 20:22

I\'m learning C++ and I have this problem:

#include 
using namespace std;


class test
{
    public:
             


        
相关标签:
2条回答
  • 2021-01-25 20:53

    Let's examine how the line

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

    is translated.

    Step 1.

    cout << obj
    

    becomes

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

    Step 2.

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

    becomes

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

    Step 3.

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

    becomes

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

    Step 4.

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

    becomes

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

    That's the entire line.

    In such an expression there is no guarantee that operator<<(cout, obj) will be executed before ++obj. It appears that in your platform, ++obj is executed before operator<<(cout, obj) is executed. That explains the behavior.

    Please note that the standard has changed. If you are able to use C++17, you will get the expected behavior.

    0 讨论(0)
  • 2021-01-25 20:54

    For starters the data member i can be uninitialized if the default constructor will be used.

    Either declare the data member like

    int var = 0;

    Or redefine the default constructor for example by using the delegating constructor.

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

    The pre-increment operator should look like

    test& operator++(){++var; return *this;}
                                     ^^^^^
    

    In the post-increment operator the identifier dummy is not used. So remove it

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

    This statement

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

    has undefined behavior because reading writing the object obj are not sequenced.

    You have to split this statement into two statements

    cout << obj <<' ';
    cout << ++obj<<endl;
    
    0 讨论(0)
提交回复
热议问题