C++ 堆上创建对象与栈上创建对象的区别 创建对象时有和无花括号的区别
来源:互联网 发布:脉冲爆震发动机 知乎 编辑:程序博客网 时间:2024/06/05 11:01
在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
阅读全文
0 0
- C++ 堆上创建对象与栈上创建对象的区别 创建对象时有和无花括号的区别
- C++类的定义和对象的创建 在栈上创建 在堆上创建
- 如何只在栈上创建对象和只在堆上创建对象与创建出无法继承的对象
- Java中堆和栈创建对象的区别
- Java中堆和栈创建对象的区别
- Java中堆和栈创建对象的区别
- Java中堆和栈创建对象的区别
- Java中堆和栈创建对象的区别
- Java中堆和栈创建对象的区别
- Java中堆和栈创建对象的区别
- Java中堆和栈创建对象的区别
- 对象在堆上的创建问题
- 声明对象和创建对象的区别
- C++:在堆上创建对象,还是在栈上?
- C++只在堆上与栈上创建对象
- C++堆还是栈上创建对象
- 只能堆/栈上创建对象
- C++中创建对象的时候加括号和不加括号的区别
- WEB前端JS弹窗
- 相机坐标,图像坐标,大地物理坐标
- 面试题14. 调整数组顺序使奇数位于偶数前面
- 安卓开发-最简单快速的仿微信聊天实现-附赠微信原生表情,QQ原生表情
- android Error:Abnormal build process termination:
- C++ 堆上创建对象与栈上创建对象的区别 创建对象时有和无花括号的区别
- 数据库中视图的作用
- dinic 优化模板 BZOJ 3438 小M的作物 (最小割)
- 448. Find All Numbers Disappeared in an Array
- pvcreate出现错误:Device /dev/sdb1 not found (or ignored by filtering).
- Dynamics CRM plugin调试方法之Profiler
- 异常
- 实现后台管理登陆
- python中event事件应用举例