• C++ 两种实例化方式


    C++ 两种实例化方式

    实例化是指在面向对象的编程中,把 用类创建对象的过程 称为实例化。 是将一个抽象的概念类,具体到该类实物的过程,例如编程语言 Java 实例化过程中一般是这样的。

    类名称 对象名称 = new 类名称(参数1, 参数2, ..., 参数n);
    
    • 1

    例如实例化出 Date 类的对象。

    Date date = new Date();
    
    • 1

    这就是用日期类创建了一个日期的对象,这就叫对象的实例化。多数编程语言实例化一个对象就是为对象开辟内存空间,或者连变量都不声明,直接使用 new 建立一个临时对象。

    1. 实例化方式

    不过相比编程语言 Java 必须使用关键字 new 创建对象来说 C++ 稍有不同, C++ 支持以下两种实例化对象的方式,分别为使用关键字 new 和不使用关键字 new,就像下面这样。

    Hello hello;
    
    • 1
    Hello * hello = new Hello();
    
    • 1

    看,这是不是很像 C 语言的结构体定义

    typedef struct {
        int a;
        int b;
    }  Hello;
    
    • 1
    • 2
    • 3
    • 4
    Hello hello;
    Hello * hello = malloc(sizeof(Hello));
    
    • 1
    • 2

    2. 两种实例化方式区别

    C++ 使用 new 实例化对象和不使用 new 实例化对象的区别是:

    • 不使用 new 是在 中为对象分配内存,使用 new 则属于动态内存分配是在 中为对象分配内存。这两种方式在一般应用中是没有什么区别的,但动态内存分配会使对象的可控性增强。

    • 如果创建对象需要使用的内存较多,则需要使用 new 来动态分配内存,创建对象只需要消耗的内存不多则可以直接分配内存。

    • 使用 new 创建的对象,在不需要使用的情况下需要我们手动使用 delete 删除释放该对象占用的内存,没有使用 new 创建的对象在不使用的情况下系统会自动回收被占用的内存。

    针对第二点做一个详细说明:

    C++ 的类与 C 语言的结构体非常类似,在 C 语言中如果一个结构体内部的成员很多则定义结构体变量需要的内存很大,此时就无法直接在函数内部定义结构体变量,因为定义在函数内部的局部变量在栈中分配内存,这容易导致栈溢出。所以要么使用 malloc() 函数来动态内存分配,或将结构体定义为全局的结构体变量。

    所以同样的道理,所以如果创建对象需要使用的内存较多,则需要使用 new 来动态分配内存。

    3. 实例化注意事项

    在大一点的项目设计中,有时候不使用 new 的确会带来很多问题。当然这都是跟new 的用法有关的。new 创建类对象,使用完后需使用 delete 删除,跟申请内存类似。所以,new 在一些场景下又不太适合,比如在频繁调用场合,使用局部new 类对象就不是个好选择,使用全局类对象或一个经过初始化的全局类指针似乎更加高效。

    4. new 创建对象总结

    下面总结的一些关于 new 创建类对象特点:

    • new 创建的类对象需要指针接收,一处初始化,多处使用。

    • new 创建类对象使用完需 delete 销毁。

    • new 创建对象直接使用堆空间,而局部不用 new 定义类对象则使用栈空间。

    • new 对象指针用途广泛,比如作为函数返回值,函数参数等。

    • 频繁调用场合并不适合 new,就像 new 申请和释放内存一样。

    • 在只定义类指针的情况下和不用 new 创建对象(例如 Hello hello;)有很大区别。类指针可以先行定义,但在使用 new 创建对象并为该类对象分配任何内存空间之前类指针实际上都只是个通用指针,例如 Hello * phello = NULL; 类指针对于该情况如果未经过对象初始化,则不需要 delete 释放。

  • 相关阅读:
    Nginx基础学习
    Doris相关记录
    【web-避开客户端控件】(2.4)安全处理客户端数据:客户端传送数据、确认客户端生成的数据、日志与警报
    MM-Camera架构-Preview 流程分析
    Redis缓存设计与性能优化【缓存穿透、缓存击穿、缓存雪崩】
    C语言百日刷题第四天
    2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校心理咨询管理系统0e78p
    对一条Linux命令的解读(sed find egrep)
    信息增益,经验熵和经验条件熵——决策树
    Eclipse插件的使用和开发
  • 原文地址:https://blog.csdn.net/jf_52001760/article/details/128125883