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;

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

Point* p4=new Point();

p4->print();

delete p4;

对象数组

int arr2是未初始化的int型数组,但Point pts2会利用无参构造或参数都是缺省值的有参构造初始化

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

相关推荐
en.en..2 分钟前
Linux 进程退出exit(函数)
java·开发语言·算法
Cx330❀5 分钟前
【Qt 进阶指南】详解 Qt 常用标准对话框与主窗口组件架构
开发语言·qt·ui·性能优化·架构·图形渲染
Light Gao6 分钟前
Encoder 与 Decoder 详解:从 Embedding 到 Seq2Seq 的完整数据流
java·开发语言·embedding
HZZD_HZZD7 分钟前
弱网下CoAP还省吗?合众致达Cat.1电表90天实测:MQTT重连流量占52%、续航差距从38%拉大到73%
开发语言·物联网·php·腾讯云
web打印社区10 分钟前
Windows 网页静默打印设置步骤:客户端、防火墙与联调清单
开发语言·前端·javascript·chrome·pdf·ecmascript
恋猫de小郭17 分钟前
KMP 又改了编译流程, Separate Compilation 禁止了 `commonMain` 的依赖穿透
android·前端·flutter
小师兄吃牛肉19 分钟前
什么是R语言?如何快速学习R语言
开发语言·学习·r语言
吴声子夜歌19 分钟前
Nginx应用与运维——Nginx Web服务应用实战(静态文件服务器的搭建)
运维·前端·nginx
y = xⁿ37 分钟前
关于Agent工程落地
前端·人工智能·python
Evand J41 分钟前
【MATLAB例程】三维快速扩展随机树(RRT)路径规划与到达角(AOA)、到达时间差(TDOA)融合定位,附下载链接
开发语言·matlab·代码·定位·例程