小朋友学C++(16):C++创建对象的3种方式

网友投稿 971 2022-09-04

小朋友学C++(16):C++创建对象的3种方式

小朋友学C++(16):C++创建对象的3种方式

先看程序:

#include 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

分析: (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语句来释放内存。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:MySQL 索引原理及设计(mysql创建数据表)
下一篇:小朋友学C语言(25):两数交换
相关文章

 发表评论

暂时没有评论,来抢沙发吧~