c語言入門到c++使用高手:深入學習C++之類 (四)

第三章 類

第四節 類內初始化,默認構造函數, =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;

關於c語言入門到c++使用高手的完整章節在這篇博客中,建議收藏!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章