Topic1:構造函數初始化列表。
Q1:何時需要使用參數化列表進行類成員初始化?
case1:當類中包含的類對象成員沒有默認的構造函數時候。
#include <iostream>
class A
{
private:
int i;
public:
A(int i){std::cout<<"A(int)"<<std::endl;}
};
class B
{
private:
A a;
public:
B():a(3)//這裏A類重新寫了帶參數的構造函數,所以必須在參數列表初始化否則報錯說不存在A()構造函數
{
std::cout<<"B()"<<std::endl;
}
};
int main()
{
B b;
return 0;
}
Case2:當成員函數含有const成員或者成員的&
#include <iostream>
class A
{
private:
const int i;
public:
A():i(1){//注意在參數列表對const成員初始化
std::cout<<"A()"<<std::endl;
}
};
#include <iostream>
class A
{
private:
int &i;
public:
A(int j):i(j)//注意在參數列表構造成員的&
{
std::cout<<"A()"<<std::endl;
}
};
Case3:派生類的構造函數數的參數列表初始化父類成員
#include <iostream>
class Base
{
private:
int i;
public:
Base(int i)
{
this->i=i;
std::cout<<"Base()"<<std::endl;
}
};
class Child:public Base
{
private:
public:
Child():Base(1)
{
std::cout<<"Child()"<<std::endl;
}
};
//注意:參數列表初始化的是成員定義的順序,不是參數列表的順序
#include <iostream>
class A{};
class B{};
class C
{
private:
A a;
B b;
public:
C():b(),a()//注意還是調用A的構造函數然後是B的構造函數
{
std::cout<<" C()"<<std::endl;
}
};