PoEduo - C++阶段班【Po学校】-09复习Object.- 课堂笔记
一 复习Object
1-->类 属性 复习
1.0 类是抽象的,不实际的。 对象是实际存在的。
1.1 访问权限:1公有 public 2私有 private 3保护 protected
1.2 class生成的类中,默认为私有private属性。
1.3 struct(结构体)生成的类中,默认为公有public.
1.4 struct在C语言中是不能有函数的,在C++中可以有。
2-->类 复习
2.0 默认构造函数,默认析构函数。默认构造函数是没有参数的,没有返回值。析构函数也是没有任何参数和返回值的。
2.1 初始化列 与 计算列的区别:1 引用的初始化 2const修饰过的数据初始化,这两种必须在初始化列进行初始化,计算列对引用和const数据无力。
2.2 初始化列里面是正儿八经的初始化,如int num = num;int &rnum= num;
2.3 转换构造时,用explicit禁止隐式转换。
2.4 拷贝构造,在什么时期会调用拷贝构造呢?如:1 Demo demo; Demo demo1 = demo; 2参数传参的时候。3当函数返回一个对象,进行返回的时候。
2.5 默认的拷贝构造函数是一个空函数? 选择 A:是的。 B:不是的。 答案:B
2.6 默认拷贝构造里面不是空的,默认进行浅拷贝。
2.7 赋值函数也会默认生成,里面实现的也是浅拷贝。
2.8 取址运算符(operator*) 取址运算符(operator*)const版本,这里说的就是*而不是&。根据地址取里面的值
二 运算符的重载
1-->运算符重载 原则 复习
1.0 两种方式重载 1成员函数 2友元函数
1.1 重载原则 :单目运算符重载:成员函数 双目运算符的重载:友元函数
1.2 友元分两种:一种是自身在前,一种是自身在后的。
1.3 赋值符号(=)取下标符号([])以及间接访问符号(->)这三种运算符无法重载为友元函数。虽然它们是双目运算符,但它们要用成员函数来进行重载。
2-->运算符重载 类转换 新知识点
2.1 当一个自定义的类型如:Demo想转换成int类型,这就由operator int()出马了,如上图。
2.2 当然还可以重载已知类型:operator double() operator long() 等。
2.3 类型转换重载,需要注意const版本的问题。
3-->智能指针 新知识点
3.0 代码:
#include <iostream> class Demo { private: int num_; public: Demo(int num =0):num_(num){} void Open(){} void Close(){} }; class MyPoint { private: Demo *demo_; public: MyPoint() { demo_ = new Demo; } ~MyPoint() { delete demo_; } Demo* operator->() { return demo_; } }; int main() { MyPoint point; point->Open(); point->Close(); return 0; }
3.1 最大的好处是:能够合适的时候进行释放。
3.2 写智能指针,关键点就是把operator->进行了重载。
4-->new关键字重写 新知识点
4.0 new是先分配空间,再调用构造函数;delete是先调用析构函数,再释放空间。
4.1 operator new会有几个版本,这里看两个重载:
void* operator new() { } void* operator new(size_t size, const char* file, long line) { }
4.2 来看很少用的一种new: 这种方法很少用。
char temp[255] = { 0 }; int *pNum = new(temp)int(100);
4.3 改成自定义的:
#include <iostream> class Demo { private: int num_; public: Demo(int num =0):num_(num){} void Open(){} void Close(){} }; class MyPoint { private: Demo *demo_; public: MyPoint() { demo_ = new Demo; } ~MyPoint() { delete demo_; } Demo* operator->() { return demo_; } void* operator new() { } void* operator new(size_t size, const char* file) { } }; int main() { char temp[255]={0}; MyPoint *pNum = new(temp)MyPoint(); return 0; }
这种使用new的方法很冷僻,很少用到。它相当于是:分配一片空间到tmep,它还有一个参数的,表示从哪个地方开始,分配到temp里。