java创建对象new后面为啥可以传入参数_详解C++三种new操作符

本文解析C++中new操作符的三种形式:newoperator、operatornew与placementnew的区别及应用场景。通过实例展示了各自特点,帮助理解内存分配过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工作开发过程中,一般申请创建内存,使用的是new方法, 但是new存在三种操作符,其含义和应用的场景都不同, 这三种操作符分别是new operator, operator new, placement new。

那么new的三种操作符应该怎么使用,它们到底有什么区别呢,本文将针对这三种操作符结合例子来进行说明,最后再总结它们的特点。

8f170afbb769780b139dd51de98836b5.png

一、new operator 操作符

new operator指的就是new操作符,我们平常使用的操作符,它经历两个阶段的操作:

  1. 调用::operator new申请内存(operator new后面将进行详细说明,这里理解为C语言中的malloc)
  2. 调用类的构造函数。

首先定义类Func, 用于后面的验证测试。

8ac5a5df4e260ce314e7f64a58633694.png
9d88b024cab366640366902caa33c202.png

new operator操作符的一般调用方法

使用C++内置字符串对象,申请内存。

722299a71fdf8511fb2f9bf2657f418a.png

new operator操作符调用自定义类Func

使用自定义对象FUNC来申请内存。

b9b1ccf515c2b3bface103104192d2cb.png

最后终端输出结果如下图所示, 可以看出调用new操作符会调用对象的构造函数,而调用delete操作符会调用对象的析构函数。

0ced73d33f0305b930a94068b75b3f3e.png

new操作符不能被重载

new operator操作符是不能被重载的,与接下来将要介绍的两种new操作符的一点不同之处。

二、operator new 操作符

operator new操作符单纯申请内存,并且是可以重载的函数。

(注意:::operator new 和 ::operator delete前面加上::表示全局)

operator new操作符的一般调用方法

调用operator new申请内存,内存申请的大小为自定义类Func的大小,经过调试发现,并没有输出类Func的构造函数,也没有调用Func的析构函数

cc7404eca774ea56b105e85055bc7af8.png

重载operator new操作符

1) 首先FUNC类中添加如下信息,重载operator new操作符,支持接受一个参数。重载operator delete操作符,支持接受一个参数,该参数是一个指针,指向将要释放内存的地址。

107647dc9595a48a3aab462ba8a1a79f.png

2) 主程序中调用new创建FUNC对象,然后调用delete释放对象

5937c2c7ea4c282dffc83f200a9cb220.png

3) 运行调试之后的结果信息如下所示,new调用到重载的函数operator new, 同样的, delete也调用到重载的函数operator delete

1874fb970ba1c76a141169c815e42a04.png

重载operator new操作符的第二种版本

1)首先FUNC类中添加如下信息,重载operator new操作符,但是支持两个参数,第一个参数是申请内存的大小,第二个参数则是一个字符串信息。

2beff56761df9da9a5ad87a2af48a9fb.png

2)主程序中调用new创建FUNC对象,并且构造函数传入字符串信息,然后调用delete释放对象

49144ebeeff4a204ad3e7711bad0acc5.png

3)运行调试之后的结果信息如下所示,new调用到重载的函数operator new的第二个版本

f0a137e6194b8dab523e059251904323.png

三、placement new操作符

placement new操作符是重载operator new的一个版本,该函数的执行忽略了size_t参数,只返还第二个参数,该函数允许在已经构建好的内存中创建对象,这个是什么概念呢,后面将进行说明。下面是placement new操作符的声明以及调用方法。

4d9deabb75f5b98b1f23cf4ca1cafecf.png

1、placement new操作符的使用方法,首先提前申请好内存,然后在需要使用FUNC对象的时候,调用placement new来将对象指向已经创建好的内存地址,最后使用完成之后,需要手动调用析构函数,并且释放创建的内存。

b5a3b3a9ac8f86acbcf40ebdd22a38c6.png

2、 终端输出打印信息如下所示, 从中可以发现placement new会调用到对象的构造函数

8fe32487bd477b3177b339525bf296cd.png

四、总结

最后我们总结下new三种操作方的特点,具体如下:

  1. new operator即new操作符,不能被重载,调用的时候,先申请内存,再调用构造函数,这是常用的调用方式。
  2. operator new操作符,能够被重载,单纯申请内存,相当于C语言中的malloc, 如果重载了operator new操作符,又需要调用原来的函数,那么需要在操作符前面加上::(即 ::operator new),重载该操作符通常是为了实现不同的内存分配方式。
  3. placement new操作符,仅仅返回已经申请好内存的指针,它通常应用在对效率要求高的场景下,提前申请好内存,能够节省申请内存过程中耗费的时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值