SigTerm
SigTerm

Reputation: 26429

Which constructor is invoked here?

In this code fragment, which constructor is actually called?

Vector v = getVector(); 

Vector has copy constructor, default constructor and assignment operator:

class Vector {
public:
    ...
    Vector();
    Vector(const Vector& other);
    Vector& operator=(const Vector& other);
};

getVector returns by value.

Vector getVector();

Code uses C++03 standard.

Code fragment looks like it is supposed to call default constructor and then assignment operator, but I suspect that this declaration is another form of using copy constructor. Which is correct?

Upvotes: 7

Views: 216

Answers (4)

Alok Save
Alok Save

Reputation: 206566

Always remember the rule:
Whenever, an object is being created and given some value in the same single statement then it is never an assignment.

To add Further,

Case 1:

Vector v1;
Vector v(v1);

Case 2:

   Vector v = getVector(); 

In the above two formats Case 1 is Direct Initialization while Case 2 is known as Copy Initialization.

How does Copy Initialization work?
Copy initialization constructs an implicit conversion sequence: It tries to convert return value of getVector() to an object of type Vector. It can then copy the created object into the object being initialized, So it needs a accessible copy constructor.

Upvotes: 1

Austin Hastings
Austin Hastings

Reputation: 627

Assuming that you haven't done something pathological outside of the code you are showing, your declaration is a copy-initialization, and the second part of this rule applies:

13.3.1.3 Initialization by constructor [over.match.ctor]

1 When objects of class type are direct-initialized (8.5), or copy-initialized from an 
  expression of the same or a derived class type (8.5), overload resolution selects the
  constructor. For direct-initialization, the candidate functions are all the constructors
  of the class of the object being initialized. For copy-initialization, the candidate 
  functions are all the converting constructors (12.3.1) of that class. The argument 
  list is the expression-list within the parentheses of the initializer.

For a simple test case, see Eli Bendersky's post, here: http://eli.thegreenplace.net/2003/07/23/variable-initialization-in-c/

Upvotes: 2

SirGuy
SirGuy

Reputation: 10780

The copy constructor actually gets elided in this case (check this) and just the default constructor ends up getting called

EDIT:

The constructor is only sometimes elided, as per Benjamin's answer. For some reason I read that as you calling the constructor directly.

Upvotes: 0

Benjamin Lindley
Benjamin Lindley

Reputation: 103733

When = appears in an initialization, it calls the copy constructor. The general form is not exactly the same as calling the copy constructor directly though. In the statement T a = expr;, what happens is that if expr is of type T, the copy constructor is called. If expr is not of type T, then first an implicit conversion is done, if possible, then the copy constructor is called with that as an argument. If an implicit conversion is not possible, then the code is ill-formed.

Depending upon how getVector() is structured, the copy may be optimized away, and the object that was created inside the function is the same physical object that gets stored in v.

Upvotes: 8

Related Questions