C++对象创建的几种方式

           C++对象创建的几种方式


   由于公司的项目众多,且底层由众多团队操刀实施,这样不利于代码的管理和平台的统一性,所以为了将众多的底层C实现的代码整合起来,不得不借助C++的面相对象,而我也不得不捞起早已经忘的差不多的C++语法了。下面先来点简单的C++中对象创建的几种方式。



具体实现

   先直接上代码,给大家演示一下,后续再来详细解释几种创建的方式,具体代码如下:

#include<stdio.h>
using namespace std;
class ObjectClass{
public:
	void fun(){
		printf("Hello, Im c++ objectClass\n");
	}
};

int main(){
	ObjectClass obj1;//栈中分配  ,由操作系统进行内存的分配和管理
	ObjectClass obj2 = obj1; //栈中分配  ,由操作系统进行内存的分配和管理
	obj1.fun();//"." 是结构体成员引用
	obj2.fun();//"." 是结构体成员引用

	ObjectClass * obj3 = new ObjectClass(); //堆中分配  ,由管理者进行内存的分配和管理,用完必须delete(),否则可能造成内存泄漏
	obj3->fun();//->是指针引用
	delete(obj3);
	return 0;
}	

root@A920:/system/bin # ./ObjectClass
Hello, Im c++ objectClass
Hello, Im c++ objectClass
Hello, Im c++ objectClass



上面就是具体的演示代码,下面分析一下几种创建方式:
(1).第一种和第二种:这两种没什么区别,一个隐式调用,一个显式调用,两者都是在进程虚拟地址空间中的栈中分配内存。用这种方法创建的对象,内存分配到栈里(Stack)。使用 “.” 而不是 “->” 调用对象的方法。当程序离开对象的使用范围(如方法结束,一个程度块的最后{}),范围内的栈中的对象会自动删除,内存自动回收。这是创建对象最简单的方式栈是系统数据结构,对于线程/进程是唯一的,它的分配和释放由操作系统决定,不需要由开发者来管理。在执行函数时,函数内局部变量的存储单元可以在栈上创建,函数执行完毕,系统会自动释放这些存储单元。

(2).第三种:使用了new,在堆中分配了内存,堆上的内存分配,亦称动态内存分配。程序在运行的期间用malloc申请的内存,这部分内存由程序员自己负责管理,其生存期由开发者决定:在何时分配,分配多少,并在何时用free来释放该内存。这是唯一可以由开发者参与管理的内存。使用的好坏直接决定系统的性能和稳定。注意:栈中内存的分配和管理由操作系统决定,而堆中内存的分配和管理由管理者决定。在堆中的对象不会自动删除,内存不会自动回收,所以new一个对象使用完毕,必须调用delete,释放内存空间。也就是说,new和delete必须成对出现

我们需要的内存很少,你又能确定你到底需要多少内存时,用栈。当你需要在运行时才知道你到底需要多少内存时,请用堆。



总结

   最后我们来总结一下C++语法new创建对象的特点和C++内存分配常见的几种方式:

(1) 关于new创建类对象特点

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

(2).C++内存分配三种方式

  • 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。

  • 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束后在将这些局部变量的内存空间回收。在栈上分配内存空间效率很高,但是分配的内存容量有限。

  • 从堆上分配的。程序在运行的时候用 malloc 或 new 申请任意多少的内存,程序员自己负责在何时用 free 或 delete 释放内存。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值