Member Initialization
Foo(int num) : bar(num) {};
understand like this
int bar = num;
equivalent
Foo(int num) : bar() {bar = num;}
the object will be constructed and initialized in one operation. like copy constructor.
Member Assignment
Foo(int num)
{
bar = num;
}
understand like this
int bar;
bar = num;
equivalent
Foo(int num): bar(num){}
the object will be constructed and initialized in two operation. first call default constructors and then reassigned. So some situations must use member initialization, like non static const member or reference member ,which can not be reassigned. like member object do not have default constructor.it will call default construtor but can not find the default constructor.
Situations
1.Initialization of non static const members
class Test {
const int t;
public:
Test(int t):t(t) {} //Initializer list must be used
};
2.Initialization of reference members
class Test {
int &t;
public:
Test(int &t):t(t) {} //Initializer list must be used
};
3.Initialization of member object which do not have default constructor
class A {
int i;
public:
A(int );
};
A::A(int arg) {
i = arg;
cout << "A's Constructor called: Value of i: " << i << endl;
}
// Class B contains object of A
class B {
A a;
public:
B(int );
};
B::B(int x):a(x) { //Initializer list must be used
cout << "B's Constructor called";
}
/* OUTPUT:
A's Constructor called: Value of i: 10
B's Constructor called
*/
a as a member object, if use member assignment, it will call the default constructor, but there is not a default constructor. if you write the default constructor, it will ok,(the compiler will create default constructor if you do not write one constructor).
4.Initialization of base class member
class A {
int i;
public:
A(int );
};
A::A(int arg) {
i = arg;
cout << "A's Constructor called: Value of i: " << i << endl;
}
// Class B is derived from A
class B: A {
public:
B(int );
};
B::B(int x):A(x) { //Initializer list must be used
cout << "B's Constructor called";
}
int main() {
B obj(10);
return 0;
}
URL
What is this weird colon-member (" : ") syntax in the constructor?