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.单例模式(重要)

相关推荐
koooo~1 小时前
【无标题】
前端
HHBon1 小时前
判断用户输入昵称是否存在(Python)
linux·开发语言·python
Attacking-Coder1 小时前
前端面试宝典---前端水印
前端
苇柠3 小时前
Java补充(Java8新特性)(和IO都很重要)
java·开发语言·windows
156082072194 小时前
在QT中,利用charts库绘制FFT图形
开发语言·qt
姑苏洛言4 小时前
基于微信公众号小程序的课表管理平台设计与实现
前端·后端
小鹭同学_4 小时前
Java基础 Day27
java·开发语言
烛阴4 小时前
比UUID更快更小更强大!NanoID唯一ID生成神器全解析
前端·javascript·后端
EdmundXjs4 小时前
IO Vs NIO
java·开发语言·nio
why1514 小时前
字节golang后端二面
开发语言·后端·golang