第三章 類
第四節 類內初始化,默認構造函數, =default
1. 類相關非成員函數
- 可以將函數聲明放在對應類的頭文件中,但是不放在類中,函數實現放在對應類的源文件中
//在Time.h中添加
//普通函數聲明
void WriteTime(Time &mytime);
//在Time.cpp中添加函數定義
//普通函數,不是類的成員函數
void WriteTime(Time &mytime){
std::cout << mytime.Hour << std::endl;
}
// main.cpp的函數實現爲
#include <iostream>
#include "Time.h"
using namespace std;
int main() {
Time mytime{12, 34,3};
WriteTime(mytime);
return 0;
}
2. 類內初始化
- 在c++11中,我們可以爲類內的成員變量提供一個初始值,我們在創建對象的時候,這個初始值就用來初始化該成員變量
// 創建對象的時候就進行初始化,如果構造函數中對Second有賦值,將會覆蓋原始的0
int Second = 0;
3. const成員變量的初始化
- 在構造函數的初始化列表中進行,不可以通過賦值初始化,或者直接在定義const的成員變量的時候進行初始化
// 定義了一個成員常量
const int ctestvalue=90;
4. 默認構造函數
-
沒有參數的構造函數,我們就稱爲默認構造函數
-
Time.h
#ifndef LESSION_PART_TWO_TIME_H
#define LESSION_PART_TWO_TIME_H
class Time2 {
public:
//不帶參數的構造函數,默認構造函數
explicit Time2();
public:
int Hour;
int Minute;
int Second{0};
};
- Time.cpp
#include <iostream>
#include "Time.h"
Time2::Time2() {
Hour = 12;
}
- main.cpp
#include <iostream>
#include "Time.h"
using namespace std;
int main() {
//生成對象時,會調用類的構造函數的
Time2 mytime2;
return 0;
}
沒有構造函數時, 類對象怎麼初始化呢?
-
默認初始化,類通過一個特殊的構造函數來執行默認的初始化構成,這個函數就叫做默認的構造函數,也就是無參的構造函數
-
如果在類定義中沒有構造函數的情況下,編譯器就會隱式的自動定義一個默認構造函數,不帶參數,無參的,被稱爲"合成的默認構造函數"
-
"合成的默認構造函數"的作用是什麼呢? 如果有初始值,就把初始值賦給對應的成員變量,其他的就是隨意賦值,一般來講最好還是自己寫構造函數
-
一旦我們自己寫了一個構造函數,不管構造函數帶幾個參數,編譯器都不會爲我們創建"合成的默認構造函數"
5. =default, =delete
-
c++11標準引入的
-
=default: 編譯器能夠爲我們自動生成函數體(帶參數的構造函數不可使用,非特殊函數也不可使用)
Time2() = default;
- =delete: 讓我們顯式的禁用某個函數
// 沒有不帶參數的構造函數,所以定義對象失敗
Time2() = delete;