织梦CMS - 轻松建站从此开始!

罗索

为什么要用new来建立一个对象

落鹤生 发布于 2012-05-08 09:29 点击:次 
为什么非要去new呢?而且这样很容易忘记最后delete。 为什么不按照下面这样呢? MyClass c; c.doSome();
TAG:

我看很多人写的代码都喜欢这样写(示例)
MyClass*   pc   =   new   MyClass();
pc-> doSome();
...
delete   pc;

为什么非要去new呢?而且这样很容易忘记最后delete。
为什么不按照下面这样呢?
MyClass   c;
c.doSome();
....
我觉得这样很好阿,而且不需要delete。难道第一种写法有什么特别的好处吗?看到很多代码都是第一种写法。谢谢。

答:

     指针在传值和多态使用上比较安全。指针才是王道。。。 内存管理,多态。。。

MyClass   c;
c.doSome();
---------------------------
静态分配内存,在生成程序的时候已经确定它的内存如何分配

MyClass*   pc   =   new   MyClass();
pc-> doSome();
delete   pc;
---------------------------
动态分配内存,可以在程序运行的时候来决定如何分配,这样可以大大减少内存的浪费。

而且,C++   的一个重要特性--多态,是通过指针或者引用来使用的。如果用静态内存分配方式,无法使用。

例如:

class   A
{
public:
virtual   void   print()   {   std::cout   < <   "A::print()\n ";   }
};

class   B
{
public:
virtual   void   print()   {   std::cout   < <   "B::print()\n ";   }
};

A   *p   =   new   B;     //   基类   A   的指针,可以指向   派生类   B   的对象

p-> print();         //   B::print()

//   因为函数   print()   在基类   A   里面是   virtual   函数,同时在派生类   B   里面被修改过,
//   所以这里使用的是派生类   B   的   print(),而不是基类   A   的   print()

如果   A   里面的   print()   不是   virtual   又或者它虽然是   virtual   但在   B   里面没有被改写,那么

p-> print();         //   使用的是   A::print()


如果用静态内存分配方式,则:

A   a;       a.print();     //   只能用   A::print()
B   b;       b.print();     //   只能用   B::print()

不会有:

A   *p   =   new   B;
p-> print();             //   这里究竟是   A::print()   还是   B::print(),要看   print()   的性质

这些东西书上都有说的。建议多看看

我认为主要是作用域上的差别,一般能不用new,我都不用new的。
至于多态和函数参数,都不是问题:
多态可以这样用:
B   b;
A*   p   =   &b;
p-> dosomething();

传参数也是一样:
函数定义:
void   fn(B*   b);
调用:
fn(&b);
或者这样定义:
void   fn(B&   b);
调用:
fn(b);

 

用new是在堆上申请空间,堆的空间跟物理内存大小有关。
而静态的声明是在栈上申请空间。栈的大小有限制。

(ilovejoy)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201205/15989.html]
本文出处:百度博客 作者:ilovejoy 原文
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
相关文章
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容