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

发布于:2025-06-01 ⋅ 阅读:(125) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到