第三章 类
第一节 成员函数,对象拷贝,私有成员
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; //成员函数访问成员变量
}