c++中的关键字new是什么东西?

“new”是C++的一个关键字,它通常用来在堆上创建数组或对象,但它与一般的创建数组或对象的方法不同,它在创建数组或对象时,会返回这个对象的指针。

​提问:堆是什么东西?它与栈有什么区别?
回答:栈区——由编译器自动分配和释放,一般存放函数的参数值、局部变量的值等(速度较快);堆区——由程序员分配及释放,若程序员不释放,程序结束后可能由OS回收(速度比较慢,而且容易产生内存碎片)。所以我们在使用堆的时候要注意用完后及时的释放它。
栈的速度快,但因为是内存中的一块连续区域,所以资源宝贵,通常不大。
堆的话不要求是内存中的一块连续区域,所以通常比栈大不少。
上面的回答引用自 https://www.zhihu.com/question/36489727/answer/153427698
关于堆和栈的区别大家还可参考文章:https://baijiahao.baidu.com/s?id=1675328459615668602

说回来,继续说关键字new。

本文开始说到,“new”可以用来在堆上创建数组或对象。那我们先看一下用“new”在堆上创建数组的例子。

用new创建数组的示例代码如下:

#include <opencv2/opencv.hpp>
#include <iostream>

int main()
{
	int bucket_size = 3;
	int *bucket;
	bucket = new int[bucket_size];
	//接下来用函数memset()把刚在堆上分配的空间按字节全部初始化为0
	memset(bucket, 0, bucket_size * 4);
	std::cout << "bucket[0]的值为:" << bucket[0] << std::endl;
	std::cout << "bucket[1]的值为:" << bucket[1] << std::endl;
	std::cout << "bucket[2]的值为:" << bucket[2] << std::endl;

	return 0;
}

从上面的运行结果可以看出,我们用关键字“new”在堆上创建了一个int型数组,这个数组的元素有3个,通过“new”这种形式的创建,我们得到了其头指针,这个头指针存储在int型指针变量bucket中。

为什么函数memset()的最后一个参数要乘以4?那是因为博主的C++开发环境中一个int变量占四个字节的内存空间,详情见  https://blog.csdn.net/wenhao_ir/article/details/125336402

关于函数memset()的详情和使用中要注意的问题,可参见博文:https://blog.csdn.net/wenhao_ir/article/details/125337117

上面的代码运行结果如下图所示:

接下来,说下用new来创建类的对象的情况。当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。

假如有一个类A,那么下面这条语句:

A* pa = new A(3);

大致相当于以下三句话的作用(注意只是大致上):

A* pa = (A*)malloc(sizeof(A)); //在堆上为对象分配内存空间
pa->A::A(3); //调用类A的构造函数对对象进行初始化
return pa; //返回创建对象的指针

此时,假如我们要调用类A中的成员函数fun1(),那么可以用下面这句话调用。

pa->fun1();

总结一下:关于关键词new,主要是要明白用它在堆上创建数组或对象时,它会返回创建的数组或对象的指针,返回创建的数组或对象的指针,返回创建的数组或对象的指针!重要的事情说三遍!

其实上面示例中用new得到的数组其实也可以看成是对象,所以其实new的作用可以总结为:
“new”是C++的一个关键字,它通常用来在堆上创建对象,它会返回创建的对象的指针,它会返回创建的对象的指针,它会返回创建的对象的指针,重要的事情说三遍!

  • 25
    点赞
  • 117
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值