一、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进行测试,发现一样可以运行,也就是在某种程度上,他们底部实现的原理是一样的。
接下来测试一下申请一个对象空间大小看看:
申请对象的空间大小:
#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的函数做处理。