当前位置: 首页 > news >正文

浅谈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

相关文章:

  • 基于小波分析与深度学习的脑电信号分类(matlab)
  • 【通信】基于Matlab模拟16QAM通信下的轨道角动量
  • AcWing 4620. 旅行 树形DP,记忆化搜索
  • 使用微信小程序播放视频直播
  • 代码随想录1.5——数组:35搜索插入位置、34在排序数组中查找元素的第一个和最后一个位置、26.删除排序数组中的重复项、283移动零
  • 信号示波器MSOX3022T是德MSOX3022T混合信号示波器2+16通道
  • 计算机毕业设计之java+javaweb的大学运动场地管理系统
  • 第三章-存储系统-Cache和页式存储、虚拟存储
  • 基于springboot的学生选课系统设计与实现-计算机毕业设计源码+LW文档
  • 【FPGA教程案例87】加解密1——基于FPGA的AES加解密算法verilog实现
  • 【Linux】进程控制 (万字详解)—— 进程创建 | 进程退出 | 进程等待 | 程序替换 | 实现简易shell
  • 在互联网上少了这一步,你就别想着赚钱?
  • Java Stram之“筛选与切片”的简介说明
  • C++ Reference: Standard C++ Library reference: C Library: cfenv: FE_INVALID
  • 吸血、迁移与资本局 Move 公链大火背后
  • HTTP中的ETag在移动客户端的应用
  • idea + plantuml 画流程图
  • js中的正则表达式入门
  • MySQL主从复制读写分离及奇怪的问题
  • React系列之 Redux 架构模式
  • spark本地环境的搭建到运行第一个spark程序
  • spring-boot List转Page
  • 排序算法之--选择排序
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 网络应用优化——时延与带宽
  • 微服务框架lagom
  • ​卜东波研究员:高观点下的少儿计算思维
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • $NOIp2018$劝退记
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (算法设计与分析)第一章算法概述-习题
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • ./configure,make,make install的作用(转)
  • .bat批处理出现中文乱码的情况
  • .gitignore文件---让git自动忽略指定文件
  • .Net IOC框架入门之一 Unity
  • .NET 设计一套高性能的弱事件机制
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .net开发引用程序集提示没有强名称的解决办法
  • .NET连接数据库方式
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • @vue/cli脚手架
  • [12] 使用 CUDA 进行图像处理
  • [ABC294Ex] K-Coloring
  • [BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn
  • [c]扫雷
  • [IE编程] WebBrowser控件的多页面浏览(Tabbed Browsing)开发接口
  • [Linux]使用CentOS镜像与rpm来安装虚拟机软件
  • [Luogu P3527BZOJ 2527][Poi2011]Meteors(整体二分+BIT)