(五)C++基础之三个关键字new、delete、static

一、C++中的三个关键字

1.1、关键字new和delete

在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除。在C语言中是利用库函数malloc和free来分配和撤销内存空间的。C++提供了较简便而功能较强的运算符new和delete来取代malloc和free函数。

我们来看一下这两者的使用:

申请一个整形大小的空间:

#include <iostream>

using namespace std;

//申请一个整形大小空间
void malloc_test(void)
{
	int *p = (int *)malloc(sizeof(int));
	if (p == NULL){
		cout << "malloc err" << endl;
	}

	*p = 10;
	cout << "malloc *p:" << *p << endl;

	free(p);
	p = NULL;
}

void new_test(void)
{
	int *p = new int;
	if (p == NULL){
		cout << "new err" << endl;
	}

	*p = 10;
	cout << "new *p:" << *p << endl;

	delete p;
	p = NULL;
}

int main(void)
{
	malloc_test();
	new_test();
	return 0;
}

运行结果:
在这里插入图片描述
new和delete的使用很简单,比如你需要char那么你直接new char,因为他本身就是一个关键字。

申请五个整形大小的空间:

#include <iostream>

using namespace std;

//申请一个整形大小空间
void malloc_test(void)
{
	int *p = (int *)malloc(sizeof(int)*5);
	if (p == NULL){
		cout << "malloc err" << endl;
	}
	for (int i = 0; i < 5; i++){
		p[i] = i;
	}

	for (int i = 0; i < 5; i++){
		cout << " " << p[i];
	}
	cout << endl;
	free(p);
	p = NULL;
}

void new_test(void)
{
	int *p = new int[5];
	if (p == NULL){
		cout << "new err" << endl;
	}

	for (int i = 0; i < 5; i++){
		p[i] = i;
	}

	for (int i = 0; i < 5; i++){
		cout << " " << p[i];
	}
	cout << endl;

	delete[] p;
	p = NULL;
}

int main(void)
{
	malloc_test();
	new_test();
	return 0;
}

运行结果:
在这里插入图片描述

在这里new的使用就有些变化,需要申请int类型的5个空间是这样定义的 new int[5] 和删除一样也需要带[], delete[] p

接下来经过测试,将free代替delete和delete代替free进行测试,发现一样可以运行,也就是在某种程度上,他们底部实现的原理是一样的。

接下来测试一下申请一个对象空间大小看看:

扫描二维码关注公众号,回复: 9516906 查看本文章

申请对象的空间大小:


#include <iostream>

using namespace std;

class Test
{
public:
	Test(int m_a)
	{
		cout << "Test(int m_a)" << endl;
		a = m_a;
	}
	void print()
	{
		cout << "a = " << a << endl;
	}
	~Test()
	{
		cout << "a = " << a << ",~Test()" << endl;
	}
private:
	int a;
};

//申请一个整形大小空间
void malloc_test(void)
{
	Test *p = (Test *)malloc(sizeof(Test));
	if (p == NULL){
		cout << "malloc err" << endl;
	}

	p->print();
	free(p);
	p = NULL;
}

void new_test(void)
{
	Test *p = new Test(10);
	if (p == NULL){
		cout << "new err" << endl;
	}

	p->print();

	delete p;
	p = NULL;
}

int main(void)
{
	cout << "------------------malloc:---------------------" << endl;
	malloc_test();
	cout << "------------------new:---------------------" << endl;
	new_test();
	return 0;
}

运行结果:
在这里插入图片描述
从这个结果上看,我们就很明显看得出来new、delete和malloc、free的区别了,在使用malloc和free的时候,他并不能触发构造函数和析构函数,所以打印出来的一个乱值。

而使用new和delete的时候可以触发构造函数和析构函数,这样对于内存的管理更安全。

所以总结一下:
1、malloc和free是函数,而new和delete是关键字。
2、free和delete在某种情况下可以互用,但是强烈不建议混用。
3、在对于类的使用上,malloc不能触发构造函数,new可以触发构造函数,free不能触发析构函数,delete可以触发析构函数。

所以建议使用new和delete。

1.2、关键字static

关于static对于学过C语言的同学肯定不会陌生,他是静态修饰,但是在C++中,如果在类中定义一个静态成员变量的话,如果将她的属性定义为public的话,则必须在类外初始化,如果定义在private的话,则必须定义一个静态函数对其进行初始化。

在  C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间  的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。 

类的静态成员,属于类,也属于对象,但终归属于类。

比如:


#include <iostream>

using namespace std;

class Test
{
public:
	static int b;
	void print(void)
	{
		cout << "b = " << b << endl;
	}
private:
	int a;
};

int Test::b = 0;


int main(void)
{
	Test a;
	Test b;
	a.b++;
	a.print();
	b.b++;
	b.print();

	Test::b = 10;

	a.b++;
	a.print();
	b.b++;
	b.print();

	return 0;
}

运行结果:
在这里插入图片描述

运行结果可知,静态变量b不是属于那个对象,而是属于类的共有资源,所以可以直接使用类的方式进行访问。
在这里插入图片描述

如果静态变量属于private,则需要专门定义一个static的函数做处理。

发布了29 篇原创文章 · 获赞 0 · 访问量 421

猜你喜欢

转载自blog.csdn.net/weixin_42547950/article/details/104327783