C++ 两种实例化方式

C++ 两种实例化方式

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

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

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

Date date = new Date();

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

1. 实例化方式

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

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

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

typedef struct {
    int a;
    int b;
}  Hello;
Hello hello;
Hello * hello = malloc(sizeof(Hello));

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 释放。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值