C++关于析构函数和拷贝构造函数何时调用两个例子的理解
来源:互联网 发布:corefoundation 源码 编辑:程序博客网 时间:2024/05/21 17:50
这里,先不得不说c++的内存分配存储区中的两个——栈和堆
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量(变量超过作用域后自动回收)、函数参数等。在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用。和堆一样,用户栈在程序执行期间可以动态地扩展和收缩。
堆,就是那些由 new 分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个 new 就要对应一个 delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。堆可以动态地扩展和收缩。
拿程序来说明下(程序一牵涉到析构函数,程序二牵涉到析构函数和拷贝构造函数)
程序一:
#include <iostream>using namespace std;class A{int a; public : A(int i) { a=i; cout << a << " contruction!" << endl; }public : ~A() { cout << a << " dertruction!" << endl; }public : void print() { cout << a << endl; }};void main(){ A ob(3); ob=5; ob.print(); ob=A(12); ob.print(); }输出:
3 contruction!(调用构造函数 相当于new)
5 contruction!(调用构造函数,相当于ob=A(5);建立了一个临时对象然后再给b,这个对象作用域就在此句话中,因此此句话结束,该对象所占内存自动释放)
5 dertruction!
5(销毁的是临时对象,ob没回收)
12 contruction!
12 dertruction!(和上面一样)
12
12 dertruction!(程序结束,自动回收栈的内容)
程序2:
#include <iostream>using namespace std;class TP{ private : int a,b;public :TP(int x,int y){ a=x; b=y;}TP(TP &);~TP(){ cout << "destructor" << a << " " << b << endl; }int aa(){ return a;}int bb(){ return b;}};TP:: TP(TP &p){ a=p.a; b=p.b; cout << "copy constructor" << a << " " << b << endl; }TP fun(TP q){ cout << "OK1" << endl; int a,b; a=q.aa()+10; b=q.bb()+20; TP r(a,b); cout << "OK2" << endl; return r;}void main(){TP m(10,20),h(0,0);TP n(m);h=fun(n);cout << "h=" << h.aa() << " " << h.bb() << endl;}程序输出:
copy constructor10 20(此句是main函数第二句的执行结果,调用了拷贝构造函数)
copy constructor10 20(fun()函数调用时形参和实参的结合会调用拷贝构造函数)
OK1
OK2
copy constructor20 40(函数返回值是类的一个对象,也会调用到类的拷贝函数)
destructor20 40
destructor10 20(fun函数执行完毕,因而销毁函数内部的变量,因为入栈顺序不同,所以才有这两个输出结果)
destructor20 40(h=fun(n);fun函数有返回一个临时对象的销毁,)
h=20 40
destructor10 20(销毁n)
destructor20 40(销毁h)
destructor10 20(销毁m)(程序执行完毕,自动销毁栈里的变量,先进后出)
最后说下拷贝构造函数何时调用:
1.当用类的一个对象初始化该类的另一个对象时.
2 .如果函数的形参是类的对象,调用函数时,进行形参和实参结合时.
3 .如果函数的返回值是类的对象,函数执行完成返回调用者时.
4.需要产生一个临时类对象时。
- C++关于析构函数和拷贝构造函数何时调用两个例子的理解
- 关于析构函数和构造函数何时调用的小例子
- 类的构造函数、拷贝构造函数、赋值函数、析构函数,分别在何时调用。
- 何时调用拷贝构造函数
- 何时调用C++复制构造函数和拷贝构造函数
- 何时调用C++复制构造函数和拷贝构造函数
- 何时调用拷贝构造函数和赋值函数
- 关于对构造函数和拷贝构造函数的理解
- 何时调用构造函数和析构函数
- 何时调用构造函数和析构函数
- C++构造与析构(14) - 编译器何时创建默认构造函数和拷贝构造函数
- 构造函数、拷贝构造函数和析构函数的的调用时刻及调用顺序
- 构造函数、拷贝构造函数和析构函数的的调用时刻及调用顺序
- 构造函数、拷贝构造函数和析构函数的的调用时刻及调用顺序
- 构造函数、拷贝构造函数和析构函数的的调用时刻及调用顺序
- 关于构造函数,拷贝构造函数与析构函数的自动调用的问题分析
- 关于c++默认的构造函数、析构函数、拷贝构造函数、move函数
- 何时调用构造函数,复制构造函数,析构函数
- Jquery监听input text修改事件
- 计算机视觉、机器学习相关领域论文和源代码大集合
- 透过 Linux 内核看无锁编程
- 关于apt-get source下载源码包的问题
- 微软C#版SQLHelper.cs类
- C++关于析构函数和拷贝构造函数何时调用两个例子的理解
- AjaxPro2完整入门教程
- linux下脚本书写注意事项
- Eclipse快捷键 10个最有用的快捷键
- 什么是 .manifest 文件
- 跨浏览器开发工作小结
- 计划没有执行,并不是都是意志力的问题。
- android GridView设置边框教程!!
- OPENsmile