Aussie AI
Initializer lists for member objects
-
Book Excerpt from "Generative AI in C++"
-
by David Spuler, Ph.D.
Initializer lists for member objects
When a class declaration contains a class object as one of its members it is important to
use the correct method of initialization to retain efficiency. Consider the declaration of a
class B
containing a member object from class A
:
class A { private: int val; public: A() { val = 0; } A(int x) { val = x; } void operator = (int i) { val = i; } }; class B { private: A a; // member is itself an object public: B() { a = 1; } // INEFFICIENT };
Declaring an object of type B
will cause the default constructor for the member object of
type A
to be invoked immediately before the default constructor for B
. Then the =
operator for class A
is used to set the member object, a
. Hence, the constructor for B
involves a call to A
’s default constructor and a call to the assignment operator. The call to
A
’s default constructor is redundant and should be avoided.
Fortunately, C++ provides a convenient syntax for passing arguments to constructors
of member objects. The default constructor for B
should be recoded to use the initializer list:
B() : a(1) { } // EFFICIENT
This initialization syntax causes the constant 1 to be passed to the constructor for the
member object, a
(the constructor accepting the int
parameter is called, instead of the
default constructor). Thus, instead of calling the default constructor and the assignment
operator for A
, only the int
constructor for A
is called.
This initialization method is efficient whenever calling the default constructor for a
member object is not appropriate, for instance, when the member object is initialized by a
call to the assignment operator within the main object’s constructor (as above, where B
’s
constructor assigned to its member of type A
). This form of initialization can be used for
any type of data member (i.e. not only class objects), although it will be neither more nor
less efficient than assignment for built-in types. The special initialization syntax should
be used wherever it is applicable, since it can never be less efficient than assignment to
the data members within the constructor, and will often be more efficient.
• Next: • Up: Table of Contents |
The new AI programming book by Aussie AI co-founders:
Get your copy from Amazon: Generative AI in C++ |