In this chapter we shall learn about below topics:
1. what is constructor initializer list?
2. Constructor initializer list using “()”
3. Constructor Initializer list using “{}”
4. User cases of Constructor Initializer List.
1. Initialization of non-static const data members
2. For initialization of reference members
3. For initialization of base class members
4. When constructor’s parameter name is same as data member
What is Constructor Member Initializer list?
Constructor Member Initializer list is used to initialize the data member of a class.
Example data member initializer without constructor Member Initialization:
#include <iostream> // std::cout
// for more tutorials visit www.ProDeveloperTutorial.com
using namespace std;
class A
{
int num;
public:
// initializing a data member without constructor initializer list
A(int a) { num = a;}
};
int main(void)
{
A aObj(10);
return 0;
}
Example data member initializer WITH constructor member initialization:
#include <iostream> // std::cout
// for more tutorials visit www.ProDeveloperTutorial.com
using namespace std;
class A
{
int num;
public:
// initializing a data member with constructor initializer list
A(int a):num(a) {}
};
int main(void)
{
A aObj(10);
return 0;
}
Syntax of member initializer list:
We should use colon “:” followed by data member name and inside braces, you should give the name of the parameter got from constructor.
<Constructor_Name> (parameter) : data_member(parameter);
Constructor member initializer list using “()”
By using “()”, it will not check for narrowing.
Example, below we have assigned “int” value to “char” data type. This is called as narrowing because, integer is 4 bytes and char is 1 byte.
When we use “()”, it will not give any warning.
#include <iostream> // std::cout
// for more tutorials visit www.ProDeveloperTutorial.com
using namespace std;
class A
{
char c;
public:
A(int a): c(a) { }
};
int main(void)
{
A aObj(10);
return 0;
}
Constructor Initializer list using “{}”
By using “{}”, it will check for narrowing and produces a warning.
Generally “{}” is preferred over “()”.
#include <iostream> // std::cout
// for more tutorials visit www.ProDeveloperTutorial.com
using namespace std;
class A
{
char c;
public:
A(int a): c{a} { }
};
int main(void)
{
A aObj(10);
return 0;
}
Output:
main.cpp:12:18: warning: narrowing conversion of ‘a’ from ‘int’ to ‘char’ inside { } [-Wnarrowing]
Warning is generated.
Constructor Member Initializer list for more than one data member example:
For initialization of more than one data member, we should use “,” comma operator.
Example:
#include <iostream> // std::cout
// for more tutorials visit www.ProDeveloperTutorial.com
using namespace std;
class A
{
int num1;
int num2;
public:
A(int a, int b): num1{a}, num2{b} { }
};
int main(void)
{
A aObj(10, 20);
return 0;
}
User cases of Constructor Initializer List.
Initialization of non-static const data members
#include <iostream> // std::cout
// for more tutorials visit www.ProDeveloperTutorial.com
using namespace std;
class A
{
//const data member
const int num1;
public:
A(int a): num1{a} { }
};
int main(void)
{
A aObj(10);
return 0;
}
For initialization of reference members
#include <iostream> // std::cout
// for more tutorials visit www.ProDeveloperTutorial.com
using namespace std;
class A
{
//reference data member
int &num1;
public:
A(int a): num1{a} { }
};
int main(void)
{
A aObj(10);
return 0;
}
For initialization of base class members
#include <iostream> // std::cout
// for more tutorials visit www.ProDeveloperTutorial.com
using namespace std;
class A
{
int aNum;
public:
A(int num1): aNum{num1} { }
};
class B: public A
{
int bNum;
public:
// initializing A's data member by calling A constructor as "A {num1}"
B(int num1, int num2): A{num1}, bNum(num2) { }
};
int main(void)
{
B bObj(10,20);
return 0;
}
When constructor’s parameter name is same as data member
#include <iostream> // std::cout
// for more tutorials visit www.ProDeveloperTutorial.com
using namespace std;
class A
{
// data member
int num1;
public:
// parameter name is same as data member name
A(int num1): num1{num1} { }
};
int main(void)
{
A aObj(10);
return 0;
}