C++创建对象的两种方法(别再纠结是否需要手动释放内存了)

时间:2020-7-27 作者:admin

之前一直搞不懂C++创建对象的方式,感觉既可以 ClassName object; 又可以 ClassName *object=new ClassName 。

于是感慨:C++就不能统一一下,只用一种方法,这样好学好记又不会纠结该不该手动释放内存?

搞清楚之后才知道C++提供这两种方式,是为了更灵活地创建对象。好吧,方法多了也不是什么好事,学就完了。

方法一:

语法:ClassName object(param);

这样就声明了一个ClassName类型的object对象,C++会为它分配足够的存放对象所有成员的存储空间。

注意:为节省存储空间,C++创建对象时仅分配用于保存数据成员的空间,而类中定义的成员函数则被分配到存储空间中的一个公用区域,由该类的所有对象共享。

特点:这种方法创建的对象,内存分配是分配到栈中的,由C++缺省创建和撤销,自动调用构造函数和析构函数。(太好了不需要手动释放内存,考虑内存泄漏这个令人秃头的问题了

注意:该方法创建的对象调用类方法时,必须用“.”,而不能用“->”.如myRec.getArea();

例子: 

class Rec
{
   public:
   Rec(int width,int height);
   ~Rec();
   int getArea();

  private:
   int Rwidth;
   int Rheight;
};

方法二:

语法:ClassName *object=new ClassName(param);

delete object;

特点:这种方法是在堆上分配内存来创建对象的(与上不同);不同的是,C++用new创建对象时返回的是一个对象指针,object指向一个ClassName的对象,C++分配给object的仅仅是存放指针值的空间。而且,用new 动态创建的对象必须用delete来撤销该对象。只有delete对象才会调用其析构函数。(记住哦,千万要记得用delete手动释放内存哦;不然内存要泄漏哦,不要嫌我唠叨哦,记得手动释放内存哦)

注意:new创建的对象不是用“*”或“.”来访问该对象的成员函数的,而是用运算符“->”;

例子:

Rec *rec=new Rec(3,4);

rec->getArea();

delete rec;

顺便提一下:

一般来说,编译器将内存分为三部分:静态存储区域、栈、堆。静态存储区主要保存全局变量和静态变量,栈存储调用函数相关的变量、地址等,堆存储动态生成的变量。在c中是指由malloc,free运算产生释放的存储空间,在c++中就是指new和delete运算符作用的存储区域。

学完才知道,C++创建对象的方式有四种

https://blog.csdn.net/qq_43208303/article/details/87948433

学就完了!!!

/(ㄒoㄒ)/~~

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。