new和深浅拷贝,禁止拷贝,强制堆空间创建对象

c++四种new:
int *p=new int//throw bad_alloc
int *p=new nothrow int;//nullptr,#include //必须使用new头文件
const int *p=new const int(20); //不可修改值
int *p=new (buf) int(40);//定位new

Point *p1 = new Point();
Point *p2 = new Point(1, 1);
p1->show();
p2->show();
delete p1;
delete p2;
Point *p3 = new Point[4]{ Point(1,1), Point(1,1), Point(1,1) , Point(1,1) };//一般不用
Point *p4 = new Point[4];
p[0].show();
delete[]p3;

int *p=new int[100];这样就开辟了400字节的内存空间
int val=new int(10);//这个10表示的是值的大小,而不是开辟空间的大小
C++在new时的初始化的规律可能为:对于有构造函数的类,不论有没有括号,都用构造函数进行初始化;如果没有构造函数,
则不加括号的new只分配内存空间,不进行内存的初始化,而加了括号的new会在分配内存的同时初始化为0。

new会自动调用构造函数,而delete会自动调用析构函数
当我们使用new去动态开辟一个对象时,需要我们手写一个Delete()函数去释放这个对象,
delete会调用析构函数再去释放对象,如果把delete对象放到析构函数中是无法成功的,因为析构函数是由对象控制的
而对象这是是由new创建的,所以必须先delete。

浅拷贝:当类种存在new开辟空间的成员变量时,采用赋值运算和默认拷贝构造函数的方式进行拷贝操作都是浅拷贝
他们的问题都是因为浅拷贝导致由于对应的堆空间的指针存在两份,那么在释放空间析构时同样会析构两边
那么程序就会出现错误

深拷贝就是解决了浅拷贝的问题的拷贝。
Point::Point(const Point& ths)
{
this->x = ths.x;
this->y = ths.y;
this->point = new int(*ths.point);
}

禁止赋值拷贝操作:就是把拷贝和赋值的操作放到private中,那么外部就无法定义了
class Point
{
privare:
Point& operator=(const Point& rhs);
Point(const Point& ths);
}
如果使用c11标准的话,做法为

class Point
{
public:
Point& operator=(const Point& rhs)=delete;
Point(const Point& ths)=delete;
}//注意这是成员函数的位置是public中

如果只能把初始化的对象放到堆中而不能在栈中:

class Point
{
public:
Point(){};
void Delete(){ delete this; }
private:
~Point(){};
}

这样因为,无法调用析构函数,所以无法在栈中创建对象
int main()
{
Point *p=new Point();
p->Delete();
p=nullptr;
}
为了在main函数中调用delete函数释放对象,但是析构函数在私有中,无法被外部调用,所以我们需要在public中
手动写一个Delete函数赋值在外部进行释放空间。Delete()中的this指针会自动调用~Point()析构函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值