c++类实例化的两种⽅式:new与不new的区别
new创建类对象与不new区别
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;
}
堆空间栈空间

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。