小朋友学C++(16):C++创建对象的3种方式
来源:互联网 发布:淘宝总额今年双十一 编辑:程序博客网 时间:2024/04/27 18:27
先看程序:
#include <iostream>using namespace std;class A{private: int n;public: A(int m) { n = m; cout << "Constructor method is invoked!" << endl; } void printNum() { cout << "n = " << n << endl; }};int main(){ // 第一种 A a1(1); // a1在栈中 a1.printNum(); // 第二种 A a2 = A(2); // a2在栈中 a2.printNum(); // 第三种 A *a3 = new A(3); // a3所指的对象在堆中,但是a3本身放在栈中 a3->printNum(); delete a3; return 0;}
运行结果:
Constructor method is invoked!n = 1Constructor method is invoked!n = 2Constructor method is invoked!n = 3
分析:
(1)第一种方法和第二种方法写法略有差异,但本质上是一样的。
(2)一个由C/C++编译的程序占用的内存分为以下四个部分:
① 栈区(stack)–由编译器自动分配释放,存放函数的参数值,局部变量的值等。
② 堆区(heap)–由程序员分配释放。若程序员不释放,程序结束时可能由OS回收。 栈区的大小要远远小于堆区。
③ 全局区(静态区)(static)–全局变量和静态变量的存储是放在一块的。
里面细分有一个常量区,字符串常量和其他常量也存放在此。
该区域是在程序结束后由操作系统释放。
④ 程序代码区–存放函数体的二进制代码。 也是由操作系统进行管理的。
(3)a1和a2,都是局部变量,放在栈里。
指针a3本身放在栈区,但是它指向的对象,即new A(),放在堆里。
用malloc或new出来的对象,都是放在堆里。
cout << a3,这样得到的地址是指针a3所指的对象的地址,在堆里。
cout << &a3,这样得到的地址,是指针a3本身的地址,在栈里。
(4)new出来的对象,使用完之后,要用delete语句来释放内存。
更多内容请关注微信公众号
阅读全文
0 0
- 小朋友学C++(16):C++创建对象的3种方式
- 小朋友学C++(3):类与对象
- 小朋友学C++(2):面向过程与面向对象
- 小朋友学C语言(34):main函数的参数
- 小朋友学C++(9):构造函数的默认参数
- 小朋友学C语言(3):整数、浮点数、字符
- 小朋友学C语言(6):加法
- 小朋友学C语言(12):判断
- 小朋友学C语言(18):二进制
- 小朋友学C语言(20):数组
- 小朋友学C语言(21):字符串
- 小朋友学C语言(22):循环
- 小朋友学C语言(28):指针
- 小朋友学C++(1):Hello World!
- 小朋友学C++(5):构造函数
- 小朋友学C++(6):this指针
- 小朋友学C++(7):封装
- 小朋友学C++(8):继承
- 当程序员遇见「佛系」,会发生什么?
- 支持向量机原理(四)SMO算法原理
- OpenCV2.4.13 中Mat的理解及常用方法
- 解决confluence下日志stdout.log过大的问题
- Lab1 线性表的基本操作及其应用 sqlist linklist
- 小朋友学C++(16):C++创建对象的3种方式
- 测试数据
- Fragment的知识点总结
- 类似策略模式,Qt实现动态函数调用
- bzoj3103or3350 Palindromic Equivalence/相似回文串【manacher+并查集+完美消除序列】
- 小朋友学C++(17):析构函数
- 模仿字迹写欠条,换脸开门禁AI时代如何对付坏人手中的人工智能?
- SSH命令
- Day017