实例化是指在面向对象的编程中,把 用类创建对象的过程 称为实例化。 是将一个抽象的概念类,具体到该类实物的过程,例如编程语言 Java 实例化过程中一般是这样的。
类名称 对象名称 = new 类名称(参数1, 参数2, ..., 参数n);
例如实例化出 Date
类的对象。
Date date = new Date();
这就是用日期类创建了一个日期的对象,这就叫对象的实例化。多数编程语言实例化一个对象就是为对象开辟内存空间,或者连变量都不声明,直接使用 new
建立一个临时对象。
不过相比编程语言 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));
C++ 使用 new
实例化对象和不使用 new
实例化对象的区别是:
不使用 new
是在 栈 中为对象分配内存,使用 new
则属于动态内存分配是在 堆 中为对象分配内存。这两种方式在一般应用中是没有什么区别的,但动态内存分配会使对象的可控性增强。
如果创建对象需要使用的内存较多,则需要使用 new
来动态分配内存,创建对象只需要消耗的内存不多则可以直接分配内存。
使用 new
创建的对象,在不需要使用的情况下需要我们手动使用 delete
删除释放该对象占用的内存,没有使用 new
创建的对象在不使用的情况下系统会自动回收被占用的内存。
针对第二点做一个详细说明:
C++ 的类与 C 语言的结构体非常类似,在 C 语言中如果一个结构体内部的成员很多则定义结构体变量需要的内存很大,此时就无法直接在函数内部定义结构体变量,因为定义在函数内部的局部变量在栈中分配内存,这容易导致栈溢出。所以要么使用
malloc()
函数来动态内存分配,或将结构体定义为全局的结构体变量。所以同样的道理,所以如果创建对象需要使用的内存较多,则需要使用
new
来动态分配内存。
在大一点的项目设计中,有时候不使用 new
的确会带来很多问题。当然这都是跟new
的用法有关的。new
创建类对象,使用完后需使用 delete
删除,跟申请内存类似。所以,new
在一些场景下又不太适合,比如在频繁调用场合,使用局部new
类对象就不是个好选择,使用全局类对象或一个经过初始化的全局类指针似乎更加高效。
下面总结的一些关于 new
创建类对象特点:
new
创建的类对象需要指针接收,一处初始化,多处使用。
new
创建类对象使用完需 delete
销毁。
new
创建对象直接使用堆空间,而局部不用 new
定义类对象则使用栈空间。
new
对象指针用途广泛,比如作为函数返回值,函数参数等。
频繁调用场合并不适合 new
,就像 new
申请和释放内存一样。
在只定义类指针的情况下和不用 new
创建对象(例如 Hello hello;)有很大区别。类指针可以先行定义,但在使用 new
创建对象并为该类对象分配任何内存空间之前类指针实际上都只是个通用指针,例如 Hello * phello = NULL;
类指针对于该情况如果未经过对象初始化,则不需要 delete
释放。