Constructor calling order in C++ - Time & Space Complexity
When creating objects in C++, constructors run in a specific order. Understanding this order helps us see how the program spends time during object creation.
We want to know how the time to create an object grows when there are multiple classes involved.
Analyze the time complexity of the constructor calling order in this example.
class Base {
public:
Base() { /* some work */ }
};
class Derived : public Base {
public:
Derived() { /* some work */ }
};
int main() {
Derived obj;
}
This code creates a Derived object, which first calls the Base constructor, then the Derived constructor.
Look for constructor calls and their order.
- Primary operation: Calling constructors of Base and Derived classes.
- How many times: Each constructor is called once per object creation.
Each object creation calls constructors in a fixed sequence.
| Input Size (n) | Approx. Operations |
|---|---|
| 1 | 2 (Base + Derived constructor calls) |
| 10 | 20 (10 x 2 constructor calls) |
| 100 | 200 (100 x 2 constructor calls) |
Pattern observation: The total constructor calls grow linearly with the number of objects created.
Time Complexity: O(n)
This means the time to create n objects grows directly in proportion to n.
[X] Wrong: "The Base constructor runs multiple times per Derived object creation."
[OK] Correct: Each object creation calls the Base constructor exactly once before the Derived constructor.
Knowing constructor calling order and its time impact helps you explain object creation clearly and confidently in interviews.
"What if Derived inherited from multiple Base classes? How would the constructor calling order and time complexity change?"
Practice
Solution
Step 1: Understand constructor order in inheritance
When an object of a derived class is created, the base class constructor runs first to initialize the base part.Step 2: Identify the first constructor called
After the base class constructor, member objects and then the derived class constructor run.Final Answer:
Base class constructor -> Option CQuick Check:
Base constructor runs first [OK]
- Thinking derived constructor runs first
- Confusing member object construction order
- Assuming destructors run during construction
Solution
Step 1: Recall base constructor call syntax
In C++, the base class constructor is called in the initializer list of the derived constructor using a colon and parentheses.Step 2: Match correct syntax
Derived() : Base() {} uses the correct syntax: Derived() : Base() {}. Others are invalid or incorrect.Final Answer:
Derived() : Base() {} -> Option DQuick Check:
Use colon and parentheses for base constructor call [OK]
- Calling base constructor inside derived constructor body
- Using arrow (->) instead of colon
- Omitting parentheses after base class name
class A {
public:
A() { std::cout << "A "; }
};
class B {
public:
B() { std::cout << "B "; }
};
class C : public A {
B b;
public:
C() { std::cout << "C "; }
};
int main() {
C obj;
return 0;
}What is the output when this program runs?
Solution
Step 1: Determine constructor call order
First, base class A constructor runs printing "A ". Then member object b of class B is constructed printing "B ". Finally, derived class C constructor runs printing "C ".Step 2: Combine outputs in order
The output is "A B C " exactly in that sequence.Final Answer:
A B C -> Option AQuick Check:
Base, members, derived = A B C [OK]
- Assuming members construct before base
- Mixing order of output strings
- Ignoring member object construction
class Base {
public:
Base() { std::cout << "Base "; }
};
class Derived : public Base {
public:
Derived() { std::cout << "Derived "; }
};
int main() {
Derived d();
return 0;
}What is the output when this program runs?
Solution
Step 1: Analyze object declaration
The line 'Derived d();' is a function declaration, not an object instantiation, so no constructor runs.Step 2: Understand program output
Since no object is created, no constructors run and no output is printed.Final Answer:
No output -> Option AQuick Check:
Function declaration, no object created [OK]
- Thinking 'Derived d();' creates an object
- Expecting constructor output
- Ignoring C++ parsing rules
class X {
public:
X() { std::cout << "X "; }
};
class Y {
public:
Y() { std::cout << "Y "; }
};
class Z : public X {
Y y1, y2;
public:
Z() { std::cout << "Z "; }
};
int main() {
Z obj;
return 0;
}What is the exact output when this program runs?
Solution
Step 1: Identify constructor call order
First, base class X constructor runs printing "X ". Then member objects y1 and y2 of class Y are constructed in declaration order, printing "Y " twice.Step 2: Derived class constructor runs last
Finally, derived class Z constructor runs printing "Z ".Final Answer:
X Y Y Z -> Option BQuick Check:
Base, members in order, derived = X Y Y Z [OK]
- Mixing member construction order
- Assuming derived runs before members
- Ignoring multiple member objects
Ready to prove it?
Pass the test and this pattern moves unknown
