学了c大家都习惯用malloc申请内存。当看到一些c++的代码用new会有疑惑,new和malloc的区别是什么。
malloc是c里申请内存的方法,搭配free释放内存。
new是c++里申请内存的方法,搭配delete释放内存。
虽然这两句话好像并没有什么用。
假如我们有个结构体:
struct node
{
int prefix;
node* next[KIND];
};
现在我们要新建一个对象p。
如果用c的写法,大家会这样写。
node* p; p=(node*)malloc(sizeof(node));
而用c++的风格是这样写。
node* p; p=new node;
看起来并没有什么优越的地方。
但假如我们要对新建的对象初始化呢。
c我们会新建完对象后再进行初始化就是,但是如果要建多个对象。就要初始化多次,看似没有什么难点,但是重复的代码量会很大。
如果我们用new对象,我们可以把结构体改写下:
struct node
{
int prefix;
node* next[KIND];
node() //构造函数,和结构体同名
{
for(int i=0;i<KIND;i++)
{
next[i]=NULL;
}
prefix=0;
}
};
大家会发现相比前面c的风格,这里多了个node()
函数。这种在定义里面写的函数叫构造函数。构造函数的作用就是在我们新建对象之后执行的程序,比如我们现在新建一个对象p,并要对它初始化。
node* p; p=new node();
这里新建的时候多了个括号,代表的就是在新建p的时候执行这个这个构造函数。也就是申请了内存就顺便完成了初始化工作。
其实这个括号也可以不写,因为并没有相应的参数传入。但如果我们这样在新建对象的时候要初始化的内容有不同的要求呢?
struct node
{
int prefix;
node* next[KIND];
node(int x)
{
for(int i=0;i<KIND;i++)
{
next[i]=NULL;
}
prefix=x; //这里初始化为传入的值
}
};
那么我们新建对象的时候只需要:
node* p; p=new node(0);
这里括号就填写传入的值。
其实new在申请内存的时候可以理解就是调用了malloc函数,再运行构造函数,也就是初始化过程。耗费的时间并不会多多少,但是在代码上会更美观。这可能就是用new最大的特点了。
关于构造函数大家要注意:
c里面的结构体其实是没有构造函数这个东西的。如果用构造函数那么就是c++的风格了。而c++的结构体就是类的变种。结构体其实是一种最简单的类:
class node
{
public: int prefix;
public: node* next[KIND];
public: node(int x)
{
for(int i=0;i<KIND;i++)
{
next[i]=NULL;
}
prefix=x;
}
};
看着这个代码是不是和之前的结构体定义很像?
结构体可以理解为把类的关键字class变成struct,所有的成员属性去掉。(这个类的所有成员属性必须是公有的)。
构造函数是类特有的,对象产生被新建的时候就会被执行。