A a;

A * a = new a();

以上两种方式皆可实现类的实例化,有new的区别在于:

1.前者在堆栈中分配内存,后者为动态内存分配,在一般应用中是没有什么区别的,但动态内存分配会使对象的可控性增强。

2.不加new在栈中分配内存

3.大程序用new,小程序直接申请

4.只是把对象分配在堆栈内存中

5.new必须delete删除,不用new系统会自动回收内存

起初刚学C++时,很不习惯用new,后来看老外的程序,发现几乎都是使用new,想一想区别也不是太大,但是在大一点的项目设计中,有时候不使用 new的确会带来很多问题。当然这都是跟new的用法有关的。new创建类对象,使用完后需使用delete删除,跟申请内存类似。所以,new有时候又 不太适合,比如在频繁调用场合,使用局部new类对象就不是个好选择,使用全局类对象或一个经过初始化的全局类指针似乎更加高效。

一、new创建类对象与不new区别

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

  • new创建类对象需要指针接收,一处初始化,多处使用
  • new创建类对象使用完需delete销毁
  • new创建对象直接使用堆空间,而局部不用new定义类对象则使用栈空间
  • new对象指针用途广泛,比如作为函数返回值、函数参数等
  • 频繁调用场合并不适合new,就像new申请和释放内存一样

二、new创建类对象实例

1、new创建类对象例子:

CTest* pTest = new CTest();

delete pTest;

pTest用来接收类对象指针。

不用new,直接使用类定义申明:

CTest mTest;

此种创建方式,使用完后不需要手动释放,该类析构函数会自动执行。而new申请的对象,则只有调用到delete时再会执行析构函数,如果程序退出而没有执行delete则会造成内存泄漏。

2、只定义类指针

这跟不用new申明对象有很大区别,类指针可以先行定义,但类指针只是个通用指针,在new之前并为该类对象分配任何内存空间。比如:

CTest* pTest = NULL;

但使用普通方式创建的类对象,在创建之初就已经分配了内存空间。而类指针,如果未经过对象初始化,则不需要delete释放。

3、new对象指针作为函数参数和返回值

下面是天缘随手写一个例子,不太严谨。主要示意一下类指针对象作为返回值和参数使用。

class CTest {  public:   int a;  };   class CBest {  public:   int b;  };    CTest* fun(CBest* pBest) {      CTest* pTest = new CTest();     pTest->a = pBest->b;     return pTest;  }    int main() {     CBest* pBest = new CBest();      CTest* pRes= fun(pBest);         if(pBest!=NULL)        delete pBest;     if(pRes!=NULL)        delete pRes ;     return -1; }

c++类的实例化,有没有new的区别相关推荐

  1. 扩展方法必须在非泛型静态类中定义_第11篇:Cython面向对象编程--扩展类的实例化...

    我们前篇谈到了Cython的访问控制,并且谈论了cdef class关键字的底层操作,顺带也谈论了Python类为什么会比Cython类慢的原因.本篇我们将介绍Cython扩展类的初始化 Cython ...

  2. python的类和实例化对象

    一切皆对象,类也是对象,类来自于元类type,如果一个类没有声明自己的元类,默认它就是元类. 即类是元类的实例,通过type(类)会显示type,而实例来自于类. 类有两个属性,数据属性和函数属性,下 ...

  3. java类怎么实例化_Java类的定义及其实例化

    如果你不了解类和对象的概念,请看我往期文章. 类必须先定义才能使用.类是创建对象的模板,创建对象也叫类的实例化. 下面通过一个简单的例子来理解Java中类的定义: public class Dog{ ...

  4. [改善Java代码]让工具类不可实例化

    建议42: 让工具类不可实例化 Java项目中使用的工具类非常多,比如JDK自己的工具类java.lang.Math.java.util.Collections等都是我们经常用到的.工具类的方法和属性 ...

  5. python类和对象实例_python的类和实例化对象

    原博文 2018-12-07 16:50 − 一切皆对象,类也是对象,类来自于元类type,如果一个类没有声明自己的元类,默认它就是元类. 即类是元类的实例,通过type(类)会显示type,而实例来 ...

  6. python类和实例化

    简答介绍类和实例python是面向对象的语言,最主要的就是类和实例,类是抽象的模版创建一个类class Studen(object),class 后接类名,定义的类名大些字母开头,object为类的继 ...

  7. Java面向对象(1)--对象的创建使用类的实例化

    1.类与对象 类是对一类事物的描述,是抽象的.概念上的定义. 对象是实际存在的该类事物的每个个体,因而也称为实例(instance). 通常都是将类实例化,也就是对象的创建 可以理解为:类 = 抽象概 ...

  8. C++类模板实例化条件

    (我不想了解这个,可是考试要考.... 并不是每次使用模板类都会实例化一个类 声明一个类模板的指针和引用不会引起类模板的实例化 如果检查这个指针或引用的成员时时,类模板会实例化 定义一个对象的时候需要 ...

  9. python-演练-通过描述符来控制另一个类的实例化参数

    普通的类,实例化时无限定 # 定义一个人的类,控制一下对实例属性的类型限定 # 实例化对象的时候,对参数进行一个数据类型的限定class People:def __init__(self,name): ...

最新文章

  1. 什么是闭包?变量作用域和闭包。
  2. 理解Underscore中的uniq函数
  3. 为什么静态方法在Java中不能是抽象的
  4. 后盾网lavarel视频项目---5、淘宝镜像cnpm的原理及如何使用
  5. Xcode 中设置部分文件ARC支持
  6. 批量下载ABAP程序和表结构
  7. 做过《战神》《死亡搁浅》的光子动捕专家,怎么理解动捕?
  8. 计算机在机械制造领域中的应用论文,高科技在机械制造工艺中的应用论文
  9. 【Windows】XShell中使用小键盘和ALT键(作Meta键),使BackSpace正常
  10. pandas dataframe根据筛选结果修改值
  11. 螃蟹为什么横着走,今天为大家介绍为什么螃蟹横着走
  12. 活动目录的介绍:深入浅出Active Directory系列(一)
  13. BERT源码embedding_lookup解析
  14. MySql 递归应用
  15. 常见ERP软件简单介绍与个人评价
  16. 电子纸/墨水屏的一些了解
  17. 算法训练 旅行家的预算
  18. 2020网络安全投融资趋势报告
  19. 1101. 献给阿尔吉侬的花束 题解
  20. 网页制作用JavaScript实现不同风格的图片切换效果

热门文章

  1. mac php7 mysql.so_mac下安装php7详解
  2. mysql索引 钱缀_【mysql索引】之前缀索引-Go语言中文社区
  3. java exe 返回值_java调用exe返回值
  4. spring工厂生产对象时对象生命周期的三个阶段
  5. qt opencv cmake配置 单纯小白
  6. fatal error C1083: 无法打开预编译头文件:“Debug\opencv.pch”: No such file or directory
  7. 破解世界性技术难题! GTS让分布式事务简单高效
  8. MyBatis 源码分析 - 缓存原理
  9. Vue.js 深入响应式原理
  10. 面向组合子程序设计方法 之 新约