Default constructors (C++ only)
A default constructor is a constructor that either has no parameters, or if it has parameters, all the parameters have default values.
If no user-defined constructor exists for a class A and
one is needed, the compiler implicitly declares a default parameterless
constructor A::A(). This constructor is an inline
public member of its class. The compiler will implicitly define A::A() when
the compiler uses this constructor to create an object of type A.
The constructor will have no constructor initializer and a null body.
The compiler first implicitly defines the implicitly declared constructors
of the base classes and nonstatic data members of a class A before
defining the implicitly declared constructor of A.
No default constructor is created for a class that has any constant
or reference type members.
A constructor of a class A is trivial if
all the following are true:
- It is implicitly defined
Ahas no virtual functions and no virtual base classes- All the direct base classes of
Ahave trivial constructors - The classes of all the nonstatic data members of
Ahave trivial constructors
If any of the above are false, then the constructor is nontrivial.
A union member cannot be of a class type that has a nontrivial constructor.
Like all functions, a constructor can have default arguments. They are used to initialize member objects. If default values are supplied, the trailing arguments can be omitted in the expression list of the constructor. Note that if a constructor has any arguments that do not have default values, it is not a default constructor.
A copy constructor for a class A is a constructor
whose first parameter is of type A&, const
A&, volatile A&, or const
volatile A&. Copy constructors are used to make a copy
of one class object from another class object of the same class type.
You cannot use a copy constructor with an argument of the same type
as its class; you must use a reference. You can provide copy constructors
with additional parameters as long as they all have default arguments.
If a user-defined copy constructor does not exist for a class and
one is needed, the compiler implicitly creates a copy constructor,
with public access, for that class. A copy constructor is not created
for a class if any of its members or base classes have an inaccessible
copy constructor.
class X {
public:
// default constructor, no arguments
X();
// constructor
X(int, int , int = 0);
// copy constructor
X(const X&);
// error, incorrect argument type
X(X);
};
class Y {
public:
// default constructor with one
// default argument
Y( int = 0);
// default argument
// copy constructor
Y(const Y&, int = 0);
};