new 与malloc 的区别

学了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,所有的成员属性去掉。(这个类的所有成员属性必须是公有的)。
构造函数是类特有的,对象产生被新建的时候就会被执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值