c++中使用建構函式初始化列表的情況
C++類中成員變數的初始化有兩種方式:建構函式初始化列表和建構函式體內賦值。
一、內部資料型別(char,int……指標等)
class Animal
{
public:
Animal(int weight,int height): //A初始化列表
m_weight(weight),
m_height(height)
{
}
Animal(int weight,int height) //B函式體內初始化
{
m_weight = weight;
m_height = height;
}
private:
int m_weight;
int m_height;
}
對於這些內部型別來說,基本上是沒有區別的,效率上也不存在多大差異。
當然A和B方式不能共存的。
二、無預設建構函式的繼承關係中
class Animal
{
public:
Animal(int weight,int height): //沒有提供無參的建構函式
m_weight(weight),
m_height(height)
{
}
private:
int m_weight;
int m_height;
};
class Dog: public Animal
{
public:
Dog(int weight,int height,int type) //error 建構函式 父類Animal無合適建構函式
{
}
private:
int m_type;
}
上面的子類和父類編譯會出錯:
因為子類Dog初始化之前要進行父類Animal的初始化,但是根據Dog的建構函式,沒有給父類傳遞引數,使用了父類Animal的無引數建構函式。而父類Animal提供了有引數的建構函式,
這樣編譯器就不會給父類Animal提供一個預設的無引數的建構函式了,所以編譯時報錯,說找不到合適的預設建構函式可用。要麼提供一個無引數的建構函式,
要麼在子類的Dog的初始化列表中給父類Animal傳遞初始化引數,如下:
class Dog: public Animal
{
public:
Dog(int weight,int height,int type) : Animal(weight,height) //必須使用初始化列表增加對父類的初始化
{
this->m_type = type;
}
private:
int m_type;
}
三、類中const資料成員、引用資料成員,必須在初始化列表中初始化,不能使用賦值的方式初始化
class Dog: public Animal
{
public:
Dog(int weight,int height,int type) : Animal(weight,height),m_type (type),LEGS(4) //必須在初始化列表中初始化
{
this->m_type = type;//error
//LEGS = 4; //error
}
private:
int& m_type;
const int LEGS;
}
四、包含有自定義資料型別(類)物件的成員初始化
class Food
{
public:
Food(int type = 10)
{
m_type = type;
}
Food(Food &other) //拷貝建構函式
{
m_type = other.m_type;
}
Food & operator =(Food &other) //過載賦值=函式
{
m_type = other.m_type;
return *this;
}
private:
int m_type;
};
(1)、建構函式賦值方式 初始化成員物件m_food
class Dog: public Animal
{
public:
Dog(Food &food)
//:m_food(food)
{
m_food = food; //初始化 成員物件
}
private:
Food m_food;
};
//使用
Food fd;
Dog dog(fd);
結果:
先執行了物件型別建構函式Food(int type = 10)
然後再執行物件型別建構函式Food & operator =(Food &other)
想象是為什麼?
(2)、建構函式初始化列表方式
class Dog: public Animal
{
public:
Dog(Food &food) : m_food(food) //初始化 成員物件
{
//m_food = food;
}
private:
Food m_food;
};
//使用
Food fd;
Dog dog(fd);
結果:執行Food(Food &other)拷貝建構函式完成初始化
不同的初始化方式得到不同的結果:明顯建構函式初始化列表的方式得到更高的效率。
相關文章
- 【C++】初始化列表建構函式VS普通建構函式C++函式
- C++——建構函式之初始化列表C++函式
- C++ 類建構函式初始化列表介紹C++函式
- C++ 建構函式 explicit 關鍵字 成員初始化列表C++函式
- 建構函式,拷貝賦值函式的N種呼叫情況函式賦值
- C++中建構函式,拷貝建構函式和賦值函式的詳解C++函式賦值
- C++ 建構函式和解構函式C++函式
- C++入門記-建構函式和解構函式C++函式
- C++建構函式和解構函式呼叫虛擬函式時使用靜態聯編C++函式
- C++複製建構函式C++函式
- javascript中初始化建構函式時new所起的作用JavaScript函式
- c++中內建函式C++函式
- c++ 的學習 建構函式1C++函式
- 關於C++中建構函式的常見疑問C++函式
- 【C++】 20_初始化列表的使用C++
- C++:建構函式的分類和呼叫C++函式
- [cpp]C++中的解構函式C++函式
- 繼承中的建構函式繼承函式
- C++拷貝建構函式詳解C++函式
- C++型別轉換建構函式C++型別函式
- 類的建構函式和解構函式函式
- 預設建構函式、引數化建構函式、複製建構函式、解構函式函式
- C# 建構函式 (初始化成員變數的角色)C#函式變數
- Python列表中set函式的使用方法!Python函式
- 迴圈單連結串列建構函式、解構函式C++實現函式C++
- c/c++ 拷貝控制 建構函式的問題C++函式
- 建構函式與解構函式函式
- ## 建構函式函式
- 棧空間受限情況下C/C++函式呼叫注意事項C++函式
- 關於scala中的主建構函式函式
- C++ 移動構造和複製建構函式匹配C++函式
- C++學習筆記-----類和建構函式C++筆記函式
- 類的陣列初始化後會呼叫拷貝建構函式陣列函式
- C++ vector 列表初始化C++
- 關於建構函式與解構函式的分享函式
- c++內建函式物件C++函式物件
- Dart Constructors 建構函式使用技巧整理DartStruct函式
- C++解構函式C++函式