目录
1、OOP概述
(1)面向对象四大特征
A.抽象
把一类东西的共同属性和方法提取到一个类中,而不关注具体如何实现
B.封装
对象属性对外接是隐藏的,只能通过对象的方法进行访问和修改
通过类实现对现实情况的抽象,使用private权限实现对类的封装
class Caculater{
private:
int *Id; // 对数据进行封装,只有类能访问,外部智能通过提供的函数访问
public:
Caculater() { // 默认构造函数
std::srand(std::time(nullptr));
int randomNumber = std::rand();
Id = new int;
*Id = randomNumber;
}
Caculater(Caculater &caculater) { // 拷贝构造函数
Id = caculater.getId();
}
~Caculater() { delete Id; }
void showId()
{
if(Id) cout << "Id = " << *Id << endl;
else cout << "nullptr" << endl;
}
template <class T, class U>
auto add(const T &t, const U &u) const
{
return t + u;
}
int *getId()
{
return Id;
}
};
template <typename T>
void printf(const T &&t) { cout << t << endl; }
int main(){
// 隐式调用默认构造函数
Caculater caculater01;
// 调用成员函数
printf(caculater01.add(20, 10.1)); // 打印:30.1
return 1;
}
C.继承
派生类可以继承基类的非私有属性和方法,而无需自己重新定义
D.多态
静态多态:编译时多态
函数重载或模板重载
动态多态:运行时多态
父类型可以指向其子类型的实例,使子类型对同一方法作出不同的回应,也就是所谓的动态绑定
动态绑定
通过基类指针或引用调用虚函数时,会根据实际对象的类型来确定要调用的函数版本 基类的引用或指针调用虚函数 virtual 时发生动态绑定
(2)构造函数
A.What(什么是构造函数)
一种特殊的成员函数:
一方面它没有返回值
另一方面它和类名相同
B.Why(构造函数的作用)
主要作用是创建初始化类对象:为对象的成员赋初始值、执行一些必要的初始化操作等
C. Which(有哪些构造函数)
无参构造函数
如果没有显式定义任何构造函数,编译器将自动生成一个默认构造函数(合成默认构 造函数)。它不带任何参数,并对类的成员进行默认初始化
带参构造函数
参数列表不为空的构造函数
Student(string strStuName, int iAge )
{
m_strStuName = strStuName;
m_iAge = iAge;
}
Student(string strStuName, int iAge = 24)
{
m_strStuName = strStuName;
m_iAge = iAge;
}
拷贝构造函数
将参数中的对象深拷贝给当前对象,如果存在指针数据,一定要重新开辟空间,然后赋值
Student(const Student &stuObj)
{
this->strStuName = stuObj.getName();
this->iAge = stuObj.getAge();
this->ptrScore = new float(strObj.getScore());
}
移动构造函数
实现了数据的转移,相当于“鸠占鹊巢,还得把鹊赶尽杀绝”,移动赋值运算符同理
Student( Student &stuObj)
{
this->strStuName = stuObj.getName();
stuObj.setName("");
this->iAge = stuObj.getAge();
stuObj.setAge(0);
this->ptrScore = new float(strObj.getScore());
stuObj.score = nullptr;
}
转换构造函数
本质是带一个参数的构造函数,在需要时可以将其他类型的对象隐式转换为当前类的对象
(3)析构函数
A.What(什么是析构函数)
一个特殊的成员函数:
一方面,对象被销毁时自动调用,它不能是delete的
另一方面,和构造函数一样没有返回值
~Student(){
delete this->ptrScore;
ptrScore = nullptr;
}
B.Why(析构函数的作用)
- 可用于释放动态分配的内存
- 可用于关闭文件、数据库连接和网络连接资源
- 解锁互斥量或释放其它同步资源
(4) =default 和 =delete
A.Why
更精确地控制类的成员函数的行为,提高代码的可读性和安全性
B.How
class MyClass {
public:
// 默认构造函数
MyClass() = default; // 默认析构函数
~MyClass() = default; // 禁用拷贝构造函数
MyClass(const MyClass&) = delete; // 禁用赋值运算符
MyClass& operator=(const MyClass&) = delete; // 禁用移动构造函数
MyClass(MyClass&&) = delete; // 使用默认移动赋值运算符
MyClass& operator=(MyClass&&) = default;
};
================================================================================
若读者对C++感兴趣,欢迎阅读笔者在学习C++过程中的关于其知识点的总结系列,入口如下:
C++知识点总结全系列文章索引:
【C++知识点总结全系列 (01)】:数据类型、数据类型转换和变量
【C++知识点总结全系列 (02)】:C++中的语句、运算符和表达式详细总结
【C++知识点总结全系列 (03)】:函数(函数参数传递、可变参数、函数返回值等详细介绍)
【C++知识点总结全系列 (04)】:C++类的详细总结与分析
【C++知识点总结全系列 (05)】:IO 类的详细总结和分析
【C++知识点总结全系列 (06)】:STL六大组件总结- 配置器、容器、迭代器、适配器、算法和仿函数
【C++知识点总结全系列 (07)】:模板与泛型编程详细总结与分析
【C++知识点总结全系列 (08)】:面向对象编程OOP