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 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结束时自动回收,
