【c++】必須在類初始化列表中初始化的幾種情況
1. 類成員為const類型
2. 類成員為引用類型
復制代碼
#include <iostream>
using namespace std;
class A
{
public:
A(int &v) : i(v), p(v), j(v) {}
void print_val() { cout << "hello:" << i << " " << j << endl;}
private:
const int i;
int p;
int &j;
};
int main(int argc ,char **argv)
{
int pp = 45;
A b(pp);
b.print_val();
}
復制代碼
究其因
const對象或引用只能初始化但是不能賦值。構造函數的函數體內只能做賦值而不是初始化,因此初始化const對象或引用的唯一機會是構造函數函數體之前的初始化列表中。
從無到有叫初始化,初始化(調用拷貝構造函數)創建了新對象;賦值(調用賦值操作符)沒有創建新對象,而是對已有的對象賦值。
3. 類成員為沒有默認構造函數的類類型
復制代碼
#include <iostream>
using namespace std;
class Base
{
public:
Base(int a) : val(a) {}
private:
int val;
};
class A
{
public:
A(int v) : p(v), b(v) {}
void print_val() { cout << "hello:" << p << endl;}
private:
int p;
Base b;
};
int main(int argc ,char **argv)
{
int pp = 45;
A b(pp);
b.print_val();
}
復制代碼
原因同樣是創建對象時,要初始類成員的每一個成員
4. 如果類存在繼承關系,派生類必須在其初始化列表中調用基類的構造函數
復制代碼
#include <iostream>
using namespace std;
class Base
{
public:
Base(int a) : val(a) {}
private:
int val;
};
class A : public Base
{
public:
A(int v) : p(v), Base(v) {}
void print_val() { cout << "hello:" << p << endl;}
private:
int p;
};
int main(int argc ,char **argv)
{
int pp = 45;
A b(pp);
b.print_val();
}
復制代碼