浅谈new

一、new A与new A()的区别

#include <iostream>
using namespace std;
class A
{
public:
    int x;
    A(){
        cout << "A构造函数被调用了" << endl;
    }
    ~A(){
        cout << "A析构函数被调用了" << endl;
    }
};
int main()
{
    A* a = new A();
    cout << a->x << endl;
    return 0;
}
A构造函数被调用了
-842150451

实例一

现象:实现构造函数,使用new(),构造函数被调用,未初始化变量

分析:使用new()调用了构造函数,但构造函数中没有初始化变量,所以变量为任意值

实例二

现象:未实现构造函数,使用new(),变量被初始化

分许:编译器自动生成构造函数,并实现变量的初始化

实例三

现象:未实现构造函数,使用new,未初始化变量

分析:编译器没有自动生成构造函数???

猜测:使用new()时,编译器会给没有构造函数的对象提供一个构造函数。而使用new,构造器不会给POD类型的类提供构造函数。简而言之,当类的类型为POD时,new,new()的区别在于编译器是否提供构造器。

注:POD是一个struct或者类,且不包含构造函数、析构函数以及虚函数。

二、new的功能

new主要有以下两个功能:

1、分配空间:调用函数operator new来实现

2、调用构造函数:调用placement new来实现

operator new函数调用了malloc()函数来分配空间

placement new用于将空间充分给类中各个元素

于是有了以下两种高级操作

操作一:

class A {...} //声明一个 类 
A void *buf = malloc(sizeof(A)); //简单地分配空间。 
A *ojb = new (buf)A(); // 在分配的空间上调用构造函数。
--------------------------------------------------------
class A {int a;} 
int buf[sizeof(A)]; //在栈上,分配一个数组 
A *obj = new(buf) A(); //在这个数组上构造一个 对象 A。

操作二:

重载 operator new 和 placement new

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值