C++ Constructors

Thameera Senanayaka

Allion Technologies

What is a constructor?

  • Initializes the members of a class
  • Same name as the class
  • No return value
  • Can be public, protected or private

Order of Construction

  • Base class and member constructors in the order of declration
  • If the class is derived from virtual base classes, it initializes the object's virtual base pointers
  • If the class has or inherits virtual functions, it initializes the object's virtual function pointers
  • Execute code in its function body

Demo

Member initializer lists

  • More efficient than using assignment operators in ctor body
class Box {
public:
    Box(int width, int length, int height) 
        : m_width(width), m_length(length), m_height(height) // member init list
    {}
    int Volume() {return m_width * m_length * m_height; }

private:
    int m_width;
    int m_length;
    int m_height;
};

Explicit constructors

  • If a constructor has only one parameter (or multiple parameters except one having default values), that parameter type can be converted to the class type.
  • Can lead to subtle but serious bugs

Demo

Default constructors

  • A constructor that can be called with no arguments
  • If no ctor is defined, a default ctor is provided by compiler
  • Default constructors are special
    • Box b;
    • Box b[10];
    • std::vector<Box>(10);
    • When a derived class ctor does not explicitly call base class ctor in intialization list

Copy constructors and copy assignment operators

My_Array first;           // initialization by default constructor
My_Array second(first);   // initialization by copy constructor
My_Array third = first;   // Also initialization by copy constructor
second = third;           // assignment by copy assignment operator
// Copy ctor
X(const X& other);

// Copy assignment operator
X& operator= (const X& other);

Rule of three

  • If a class defines one (or more) of the following three, it should probably explicitly define all three.
    • Destructor
    • Copy constructor
    • Copy assignment operator
  • If one of these had to be defined by the programmer, compiler-generated ones of others may not be what the programmer needs.

Move consturctor and move assignment operator

  • Introduced by C++11
  • Topic for a separate presentation
  • Rule of 5

Explicitly defaulted / deleted constructors

  • Disallow creating instances (eg: singleton)
  • Disallow copying
struct noncopyable
{
  noncopyable() {};

private:
  noncopyable(const noncopyable&);
  noncopyable& operator=(const noncopyable&);
};
  • C++11 version

Explicitly defaulted / deleted constructors

struct noncopyable
{
  noncopyable() =default;
  noncopyable(const noncopyable&) =delete;
  noncopyable& operator=(const noncopyable&) =delete;
};

Constructors in derived classes

  • Derived class ctors always call base class ctors
  • If a base class does not have a default ctor, you must supply base class ctor parameters in the derived class ctor

Demo

Thank you!

Made with Slides.com