Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parameterized constructor for assignment

Tags:

c++

oop

c++11

I've noticed some behaviour which I can't understand in parameterized constructors. Given the following program:

#include <iostream>
using namespace std;

class A {
public:
    int x;

    A() {}

    A(int i) : x(i){
        cout << "A\n";
    }
    ~A(){
        cout << "dA\n";
    }

};

int main(){
    A p;
    p = 3;
    cout << p.x << endl;
    p = 5;
    cout << p.x << endl;
    return 0;
}

I get as output:

A
dA
3
A
dA
5
dA

This means that using = triggers the parameterized constructor, destroys the object on which it's called and creates a new object. I cannot understand this behaviour and I can't find the answer in the standard ( I am sure it is there somewhere, but it may be stated in a sophisticated way). Could someone help me with an explanation?

like image 683
Ovidiu Taralesca Avatar asked Dec 24 '22 06:12

Ovidiu Taralesca


2 Answers

The phrase you're probably looking for is "implicit conversion".

If you add a copy constructor and an assignment operator, and then give each object a unique ID, it's easier to see where things go:

int counter = 0;

class A {
public:
    int id;

    A(): id(++counter) {cout << "A(): " << id << "\n";}

    A(int i) : id(++counter) {cout << "A(" << i << "): " << id << "\n";}

    // Don't copy the id.
    // (This isn't used anywhere, but you can't see that it's not used unless it exists.)
    A(const A& a) : id(++counter) {cout << "A(" << a.id << "): " << id << "\n";}

    // Don't copy the id here either.
    A& operator=(const A&a) {cout << id << " = " << a.id << "\n"; return *this;}

    ~A(){cout << "destroy: " << id << "\n";}
};

int main(){
    A p;
    cout << "p is " << p.id << "\n";
    p = 3;
    cout << "p is " << p.id << "\n";    
    p = 5;
    cout << p.id << "\n";
}

Output:

A(): 1
p is 1
A(3): 2
1 = 2
destroy: 2
p is 1
A(5): 3
1 = 3
destroy: 3
1
destroy: 1

As you can see, the parameterized constructor is used to create a temporary object whose value can be assigned to p, and that temporary is destroyed immediately after that.
You can also see that p is alive and well until the very end.

like image 122
molbdnilo Avatar answered Dec 28 '22 07:12

molbdnilo


With a statement like

p = 3;

what you're actually doing is

p = A(3);

which really translates to

p.operator=(A(3));

The temporary A object created by A(3) of course needs to be destructed, it is temporary after all.

The object p itself will not be destructed by the assignment.

like image 28
Some programmer dude Avatar answered Dec 28 '22 07:12

Some programmer dude