
C++ 0505 析构函数
发布日期:2021-05-08 04:49:44
浏览次数:21
分类:精选文章
本文共 1541 字,大约阅读时间需要 5 分钟。
析构函数
构造函数确保一个对象被正确创建并初始化。与之相反,析构函数确保一个对象销毁前被正确清理。
生成的析构函数
如果一个类的成员拥有一个析构函数,则在包含这个成员的对象销毁时这个析构函数会被调用。
析构函数和自由空间
析构函数概念上很简单,但他是大多数最有效的C++编程技术的基础。
基本思想是: 无论一个类对象需要使用那些资源,这些资源都要在构造函数中获取。 在对象的声明周期中,他可以释放资源并获得新的资源。 在对象的声明周期结束后,析构函数释放对象拥有的所有资源。 Shape* fct() { Text tt{Point{200, 200}, "Annemarie"}; // .. Shape* p = new Text{Point{100, 100},"Nicholas"}; return p; }void f()
{ Shap* q = fct(); // ... delete q; }实际上,Shape的析构函数是virtual的,这就是问题的关键。当我们使用delete q时,
delete q会调用Shape的析构函数~Shape。但是,~Shape()是virtual的,因此使用virtual调用机制注意,析构函数是通过delete来隐式或间接调用的,不会直接调用,这样能省去很多麻烦的工作。
访问元素class vector
{ int sz; // 大小 double* elem; // 指向元素的指针 public: vector(int s):sz{s}, elem{new double[s]} {/*...*/} //构造函数 ~vector() {delete[] elem;} //析构函数int size() const{return sz;} //当前大小
double get(int n) const{return elem[n];} //访问:读 void set(int n, double v) {elem[n]=v;} //访问:写 };vector v(5);
for (int i=0; i<v.size(); ++i) { v.set(i,1.1*i); cout << "v[" << i << "]" << v.get(i) << '\n'; } v[0] = 0 v[1] = 1.1 v[2] = 2.2 v[3] = 3.3 v[4] = 4.4 指向类对象的指针vector* f(int s)
{ vector* p = new vector(s); //在自由空间中分配一个vector //填充 *p return p; }void ff()
{ vector* q = f(4); //使用 *q delete q; //在自由空间中释放vector }注意,当我们delete一个vector时,它的析构函数会被调用。
vector* p = new vector(s); //在自由空间中分配一个vector
delete p; //释放当在自由空间中创建一个vector时,new运算符:
首先为vector分配内存。 然后,调用vector的构造函数来初始化vector;构造函数为vector的元素分配内存,并初始化这些元素。当删除vector时,delete运算符:
首先调用vector的析构函数;这个析构函数调用元素的析构函数(如果他们有析构函数),然后释放元素使用的内存。 然后,释放vector使用的内存。vector<vector<double>>* p = new vector<vector<double>>(10);
delete p;发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月04日 08时22分07秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
invalid byte sequence for encoding
2021-05-08
技术美术面试问题整理
2021-05-08
ORB-SLAM2:LoopClosing线程学习随笔【李哈哈:看看总有收获篇】
2021-05-08
js求阶乘
2021-05-08
Nginx---惊群
2021-05-08
项目中常用的审计类型概述
2021-05-08
(九)实现页面底部购物车的样式
2021-05-08
python-day3 for语句完整使用
2021-05-08
基于LabVIEW的入门指南
2021-05-08
weblogic之cve-2015-4852
2021-05-08
Java注释
2021-05-08
C++ 函数重载
2021-05-08
使用mybatis-generator生成底层
2021-05-08
Mybatis【5】-- Mybatis多种增删改查那些你会了么?
2021-05-08
计算输入的一句英文语句中单词数
2021-05-08
lvs+keepalive构建高可用集群
2021-05-08
6 个 Linux 运维典型问题
2021-05-08