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

第三章 類

第一節 成員函數,對象拷貝,私有成員

1. 綜述

  • 類是我們自己定義的數據類型(新類型)

  • 設計類時要考慮的角度

  1. 站在設計和實現者的角度來考慮

  2. 站在使用者的角度來考慮

  3. 父類,子類

2. 類基礎

  • 一個類就是用戶自己定義的數據類型,把類想像成命名空間,包着一堆東西(成員函數,成員變量)

  • 一個類的構成:成員變量,成員函數(有許多特殊成員函數,後續慢慢講解)

  • 訪問類成員時,如果是類對象,我們就使用對象名.成員名來訪問成員,
    如果是指向對象的指針,我們使用指針名->成員名來訪問成員

  • public成員提供對外的接口,暴露給外界,提供外界調用,
    private成員提供各種實現類功能的細節方法,但不暴露給使用者,外界無法使用這些成員

  • struct是成員默認爲public的class, struct A {};class成員默認是私有的,class A{};
    ==> struct A{} 等價於 class A{public:}

#include <iostream>

using namespace std;
class student{
public:
    int num;
};

int main() {


    student someone;//定義類
    someone.num =100;
    cout << someone.num << endl;

    student *pstu;
    pstu = &someone;
    pstu->num = 88;
    cout <<  pstu->num << endl;

    return 0;
}

3. 成員函數

完整範例

  • Time.h
//
// Created by felaim on 2020/5/26.
//

#ifndef LESSION_PART_TWO_TIME_H
#define LESSION_PART_TWO_TIME_H

class Time {
public:
    int Hour;
    int Minute;
    int Second;

    void initTime(int tmphour, int tmpmin, int tmpsec);
};

#endif //LESSION_PART_TWO_TIME_H

  • Time.cpp
//
// Created by felaim on 2020/5/26.
//
#include "Time.h"

// 成員函數initTime的實現
// ::叫做作用域運算符,表示initTime屬於Time類
void Time::initTime(int tmphour, int tmpmin, int tmpsec) {
    //成員函數中可以直接使用成員變量名
    // 哪個對象調用的成員函數,這些成員變量就屬於對應的對象
    Hour = tmphour;
    Minute = tmpmin;
    Second = tmpsec;
}

  • main.cpp
#include <iostream>
#include "Time.h"

using namespace std;

int main() {
    Time mytime;
    mytime.initTime(11, 14, 45);
    //mytime: 11:14:45
    cout << "mytime: " << mytime.Hour << ":" << mytime.Minute << ":" << mytime.Second << endl;

    return 0;
}
  • CMakeLists.txt
cmake_minimum_required(VERSION 3.14)
project(lession_part_two)

set(CMAKE_CXX_STANDARD 11)
include_directories(./include/)
add_executable(lession_part_two main.cpp ./source/Time.cpp)

4. 對象的拷貝

  • 對象是可以拷貝的,默認情況下,這種類對象的拷貝,是每個成員變量逐個拷貝

  • 如果在Time類中我們要定義適當的"賦值運算符",就能夠控制對象的這種拷貝

#include <iostream>
#include "Time.h"

using namespace std;

int main() {
    Time myTime;
    myTime.initTime(11, 14, 45);
    //mytime: 11:14:45
    cout << "myTime: " << myTime.Hour << ":" << myTime.Minute << ":" << myTime.Second << endl;

    // 對象拷貝,斷點查看時內存地址不一樣
    Time myTime0 = myTime;
    Time myTime1{myTime};
    Time myTime2(myTime);
    Time myTime3 = {myTime};
    myTime3.Hour = 12;
    cout << "myTime: " << myTime.Hour << ":" << myTime.Minute << ":" << myTime.Second << endl;
    cout << "myTime3: " << myTime3.Hour << ":" << myTime3.Minute << ":" << myTime3.Second << endl;
    
    return 0;
}

5. 私有成員

  • Time.h
//
// Created by felaim on 2020/5/26.
//

#ifndef LESSION_PART_TWO_TIME_H
#define LESSION_PART_TWO_TIME_H

class Time {
private:
    // 私有成員變量不能在外部直接用成員變量名使用
    // 可以自己的成員函數調用
    int Millisecond;//毫秒
    void initMillTime(int mls);

public:
    int Hour;
    int Minute;
    int Second;

    void initTime(int tmphour, int tmpmin, int tmpsec);

};

#endif //LESSION_PART_TWO_TIME_H

-Time.cpp

//
// Created by felaim on 2020/5/26.
//
#include "Time.h"

// 成員函數initTime的實現
// ::叫做作用域運算符,表示initTime屬於Time類
void Time::initTime(int tmphour, int tmpmin, int tmpsec) {
    //成員函數中可以直接使用成員變量名
    // 哪個對象調用的成員函數,這些成員變量就屬於對應的對象
    Hour = tmphour;
    Minute = tmpmin;
    Second = tmpsec;

    initMillTime(25);
}

void Time::initMillTime(int mls) {
    Millisecond = mls; //成員函數訪問成員變量
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章