CPP Output Question - related to copy-constructor and return by value

Discussion in 'C++' started by sanjay, Oct 9, 2008.

  1. sanjay

    sanjay Guest

    Hi All,

    I have a doubt in understanding the output of the following program
    that i executed on my system. I was using DevC++ IDE which uses minGW
    based compiler.

    ----------------------------------------------
    #include <iostream>
    using namespace std;

    class Integer //: public DataType
    {
    private:
    int x;
    public:
    Integer(int xx = 0);
    Integer(const Integer&);
    ~Integer();
    Integer operator+(const int i);
    void operator=(const Integer& i);
    };

    Integer::Integer(int xx) : x(xx)
    {
    cout<<"Integer(int) x is "<<x<<endl;
    }
    Integer::Integer(const Integer& i) : x(i.x)
    {
    cout<<"Integer(Integer&)"<<endl;
    }
    Integer::~Integer()
    {
    cout<<"~Integer()"<<endl;
    }
    Integer Integer::eek:perator+(const int i)
    {
    cout<<"operator+ called i is "<<i<<endl;
    Integer xx(x+i);
    return xx;
    }
    void Integer::eek:perator=(const Integer& i)
    {
    cout<<"operator= called i.x is "<<i.x<<endl;
    x = i.x;
    }

    int main()
    {
    Integer i1(40);
    Integer i3=i1+10; //Doubt understanding this
    return 0;
    }
    -----------------------------------
    Output:

    Integer(int) x is 40
    operator+ called i is 10
    Integer(int) x is 50
    ~Integer()
    ~Integer()
    -------------------------------------
    I have a doubt in understanding the execution of operator+.

    Inside operator+, xx is created and is returned by value. While
    returning the copy-constructor of Integer should get invoked because
    the output of operator+ is being assigned to i3 which is not yet
    constructed, but the actual output observed is different.

    Is this any kind of optimization being performed by the compiler. Is
    there anything that i am missing.

    I would appreciate if someone can explain this.

    Regards
    Sanjay Raghani
    sanjay, Oct 9, 2008
    #1
    1. Advertising

  2. sanjay

    sanjay Guest

    Re: CPP Output Question - related to copy-constructor and return byvalue

    On Oct 9, 5:59 pm, Victor Bazarov <> wrote:
    > sanjay wrote:
    > > I have a doubt in understanding the output of the following program
    > > that i executed on my system. I was using DevC++ IDE which uses minGW
    > > based compiler.

    >
    > > ----------------------------------------------
    > > #include <iostream>
    > > using namespace std;

    >
    > > class Integer //: public DataType
    > > {
    > > private:
    > > int x;
    > > public:
    > > Integer(int xx = 0);
    > > Integer(const Integer&);
    > > ~Integer();
    > > Integer operator+(const int i);
    > > void operator=(const Integer& i);

    >
    > As a side note, operator= *usually* returns a reference to the same
    > object. It's not required, of course.
    >
    > > };

    >
    > > Integer::Integer(int xx) : x(xx)
    > > {
    > > cout<<"Integer(int) x is "<<x<<endl;
    > > }
    > > Integer::Integer(const Integer& i) : x(i.x)
    > > {
    > > cout<<"Integer(Integer&)"<<endl;

    >
    > You misrepresent the signature of your copy c-tor. The argument is a
    > reference to a const integer, so I'd expect the output statement to be
    >
    > cout << "Integer(Integer const&)" << endl;
    >
    > <g>
    >
    >
    >
    > > }
    > > Integer::~Integer()
    > > {
    > > cout<<"~Integer()"<<endl;
    > > }
    > > Integer Integer::eek:perator+(const int i)
    > > {
    > > cout<<"operator+ called i is "<<i<<endl;
    > > Integer xx(x+i);
    > > return xx;
    > > }
    > > void Integer::eek:perator=(const Integer& i)
    > > {
    > > cout<<"operator= called i.x is "<<i.x<<endl;
    > > x = i.x;
    > > }

    >
    > > int main()
    > > {
    > > Integer i1(40);
    > > Integer i3=i1+10; //Doubt understanding this
    > > return 0;
    > > }
    > > -----------------------------------
    > > Output:

    >
    > > Integer(int) x is 40
    > > operator+ called i is 10
    > > Integer(int) x is 50
    > > ~Integer()
    > > ~Integer()
    > > -------------------------------------
    > > I have a doubt in understanding the execution of operator+.

    >
    > > Inside operator+, xx is created and is returned by value. While
    > > returning the copy-constructor of Integer should get invoked because
    > > the output of operator+ is being assigned to i3 which is not yet
    > > constructed, but the actual output observed is different.

    >
    > The compiler is *allowed* to skip creation of a temporary and construct
    > the result of the right-hand side expression *directly* into the object
    > being constructed. Essentially, since the compiler sees the code for
    > all your functions, it can pass the reference to the constructed object
    > (in your case named 'i3') to the operator+ and inside the function
    > construct the actual 'i3' instead of 'xx'. No temporaries, no copies.
    >
    > > Is this any kind of optimization being performed by the compiler. Is
    > > there anything that i am missing.

    >
    > Yes, it is, and yes, you probably are.
    >
    > > I would appreciate if someone can explain this.

    >
    > I hope I have.
    >
    > V
    > --
    > Please remove capital 'A's when replying by e-mail
    > I do not respond to top-posted replies, please don't ask


    Thanks...
    sanjay, Oct 9, 2008
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. DrUg13
    Replies:
    1
    Views:
    459
    DrUg13
    Feb 10, 2004
  2. Alex Vinokur
    Replies:
    7
    Views:
    396
    Greg Comeau
    Nov 15, 2004
  3. Replies:
    3
    Views:
    329
    Victor Bazarov
    Jul 29, 2005
  4. Rahul
    Replies:
    1
    Views:
    1,238
    Thomas Grund
    Jul 7, 2008
  5. cinsk
    Replies:
    35
    Views:
    2,563
    James Kanze
    Oct 11, 2010
Loading...

Share This Page