day5 cpp:,对象的组织(const对象),

1.对象的组织(类比内置类型)

const对象

const对象只能调用const成员函数和数据成员,除了四大金刚

若成员函数没有加const(void print() const{}),即便里面没有_ix=100修改值,也不能pt2.print()访问,因为是const Point pt2(3,5)--->对象不可修改,但pt2.print()不是const成员函数,即便没修改也可能或者说可以修改

指向对象的指针

Point pt(1,2);

Point *p1=nullptr;

Point*p2=&pt;//p2不需要回收,指向栈上的对象自动回收

Point *p3=new Point(3,4);

delete p3;

|---------|------------------------|------------------------------|
| 需要存储数据时 | 先通过newmalloc分配堆内存 | int* p; *p = 1; ➔ 野指针操作 |
| 指向现有变量时 | 使用取地址符&绑定有效变量 | int* p = &局部变量; ➔ 超出作用域后失效 |
| 指针释放后 | 立即置为nullptr避免误用 | delete ptr;未置空 ➔ 悬垂指针访问 |

Point* p4=new Point();

p4->print();

delete p4;

对象数组

int arr[2]是未初始化的int型数组,但Point pts[2]会利用无参构造或参数都是缺省值的有参构造初始化

复制代码
Point pt1(2,6);
Point pt2(5,8);
Point pts[2]={pt1,pt2};
Point pts1[2]={Point(1,2),Point(3,4)};
Point pts2[]={Point(1,2),Point(3,4)};
Point pts3[5]={Point(1,2),Point(3,4)};
//注意:数组里存的是对象的副本

堆对象

复制代码
Point * pt1=new Point(11,12);
pt1->print();
delete pt1;
pt1=nullptr;

Point* pt2=new Point[5]();
pt2->print();
(pt2+1)->print();
delete [] pt2;
pt2=nullptr;

Point* pt3=new Point[3]{{1,2},{6,7},{9,7}};
delete [] pt3;
pt3=nullptr;

2.new/delete表达式的工作步骤(了解)

delete回收步骤:

先调用~Student()回收Jackie空间(数据成员申请的堆空间)

在调用operator delete库函数回收对象stu所在空间

创建对象的探究

创建堆对象的条件

需要公有的operator new,operator delete,构造函数,对析构函数没有要求.

为什么operator delete是私有,不仅delete,而且new也不行了?

虽然operator new还是公有,但若允许创建,却因operator delete是私有的无法delete销毁

为什么将构造函数私有,然后用自定义公有函数实现不行(同栈)?

因为创建对象的过程中就会调用构造函数,而构造函数在private中,这时就卡住了,在public中调用getInstance()函数需要创建完对象后才能使用

为什么将析构函数私有,却可以调用delete表达式?

可以通过自定义公有成员函数,this指针就是本对象的地址,可以实现析构函数和operator delete的功能,从而实现delete,但会有一些问题,如:多次调用void destroy()会出现问题;this指针是nullptr等

创建栈对象的条件

对operator new/operator delete没有要求,需要公有的构造函数,析构函数

为什么对operator new/operator delete没有要求?

因为栈上对象创建不涉及申请指针,不需要使用operator new/delete

为什么将构造函数私有不行(同堆创建)?

因为创建Student stu(101,"Jackie")就要使用构造函数

为什么将析构函数私有不行?

因为栈中对象stu销毁是在test0结束时自动回收,

3.单例模式(重要)

相关推荐
剪刀石头布啊6 分钟前
var、let、const与闭包、垃圾回收
前端·javascript
剪刀石头布啊8 分钟前
js常见的单例
前端·javascript
剪刀石头布啊8 分钟前
数据口径
前端·后端·程序员
剪刀石头布啊12 分钟前
http状态码大全
前端·后端·程序员
剪刀石头布啊14 分钟前
iframe通信、跨标签通信的常见方案
前端·javascript·html
宇之广曜23 分钟前
搭建 Mock 服务,实现前端自调
前端·mock
yuko093125 分钟前
【手机验证码】+86垂直居中的有趣问题
前端
用户15129054522029 分钟前
Springboot中前端向后端传递数据的几种方式
前端
阿星做前端29 分钟前
如何构建一个自己的 Node.js 模块解析器:node:module 钩子详解
前端·javascript·node.js
用户15129054522033 分钟前
Web Worker:让前端飞起来的隐形引擎
前端