C++ 堆上创建对象与栈上创建对象的区别创建对象时有和无花括号的区别

xiaoxiao2021-02-28  126

在C++中类的对象建立分为两种,一种是静态建立,如A a;另一种是动态建立,如A* p=new A(),A*p=(A*)malloc();

静态建立一个类对象,是由编译器为对象在栈空间中分配内存,通过直接移动栈顶指针挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象。动态建立类对象,是使用new运算符将对象建立在堆空间中,在栈中只保留了指向该对象的指针。

栈是由编译器自动分配释放 ,存放函数的参数值,局部变量的值,对象的引用地址等。其操作方式类似于数据结构中的栈,通常都是被调用时处于存储空间中,调用完毕立即释放。堆中通常保存程序运行时动态创建的对象,C++堆中存放的对象需要由程序员分配释放,它存在程序运行的整个生命期,直到程序结束由OS释放。

参考:http://www.cnblogs.com/xiaoxiaoqiang001/p/5557704.html

创建对象时有无花括号的区别

class Test { public:   Test() {}   Test(int a) {} } 1、栈上创建对象   1.1 无括号     Test a; // 调用默认构造函数,栈上分配内存创建对象   1.2 有括号     Test a(); // 无任何意义,声明一个返回值为Test对象的无参函数   1.3 有括号+参数     Test a(2); // 调用构造函数Test(int a),栈上分配内存创建对象 2、堆上创建对象   2.1 无括号     Test *a = new Test; // 调用默认构造函数(若由编译器生成则成员不初始化),堆上分配内存创建对象   2.2 有括号     Test *a = new Test(); // 调用默认构造函数(若由编译器生成则成员初始化),堆上分配内存创建对象   2.3 有括号+参数     Test *a = new Test(2); // 调用构造函数Test(int a),堆上分配内存创建对象   2.4 系统内置类型     new int;// 分配内存,未初始化     new int();// 分配内存,初始化为0     new int(2);// 分配内存,初始化为2

转载请注明原文地址: https://www.6miu.com/read-59005.html

最新回复(0)