第三章 類
第一節 成員函數,對象拷貝,私有成員
1. 綜述
-
類是我們自己定義的數據類型(新類型)
-
設計類時要考慮的角度
-
站在設計和實現者的角度來考慮
-
站在使用者的角度來考慮
-
父類,子類
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; //成員函數訪問成員變量
}