c++析构相关-待看
原文:http://blog.csdn.net/jacketinsysu/article/details/52239982
delete[]的析构顺序
先说一个小发现,在delete []的时候,是按照与构造顺序相反的顺序来析构的!(原来的构造顺序指的是,new []的时候,是按照下标顺序构造的)
#include <iostream>
using namespace std;class Log
{
public:void setId(int id) {this->id = id;}~Log() {cout << "Destruct " << id << endl;}private:int id;
};int main() {Log* logs = new Log[4];for (int i = 0; i < 4; ++i)logs[i].setId(i);delete [] logs;return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
上面代码的输出结果为:
Destruct 3
Destruct 2
Destruct 1
Destruct 0
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
引用变量的大小
据说编译器内部是通过“常量指针”来实现引用的,首先从它的大小来看一下:
#include <iostream>
using namespace std;class Log
{
public:void setId(int id) {this->id = id;}~Log() {cout << "Destruct " << id << endl;}private:int id;
};struct Wrapper
{Log& ref;Wrapper(Log log): ref(log) {}
};int main() {Log log;Wrapper w(log);cout << sizeof(w) << ' ' << sizeof(log) << endl;return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
输出结果是:8 4
8是一个指针的大小!ps,不能直接通过sizeof(ref)来判断,因为这样会输出4 4
,计算的是ref所引用的对象的大小。
常量指针 VS 指针常量
下一个主题需要区分指针(类型的)常量和(指向)常量(的)指针,相信看了左边括号里的注释,应该都清楚了吧?
还不清楚,只能po我自己的私藏笔记了:
常量指针,顾名思义,就是指向一个常量的指针,比如:
const int id = 555;
const int* p1 = &id;
int const* p2 = &id;*p1 = 233; // 错误!不允许通过指针修改变量的值,因为指向的是常量int hello = 666;
p1 = p2 = &hello; // 可以给指针重新赋值,指针本身不是常量
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
它的特点是,不能通过指针去修改所指向变量的值,常用于函数传参时声明变量内容不允许被修改(当然也可以用常引用)。
xx常量指的是这个变量是一个常量,不能修改其值,所以,“指针常量”指的就是这样的形式:
int id = 233, id2 = 555;
int* const p = &id;
id = 666;
p = &id2;// 错误!p是一个常量,不允许修改它的值
p = &id;// 错误!这样也不行,不要以为p的值等于&id就可以给它赋值,哼╭(╯^╰)╮
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
你可以修改原始变量的内容(只要它不是const修饰的),但是不能改变指针的值,也就是说,这个指针就只能被指定为指向这个变量了!
据说,编译器内部用常量指针来实现引用!(只是传言而已)
用指针常量来模拟引用!
直接po代码,代码清晰得,都不用解释的^_^
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <string>
using namespace std;class Log
{
public:Log(int n): id(n) {}Log& operator = (const Log& rhs) {id = rhs.id;return *this;}void display() const {cout << "Log " << id << endl;}private:int id;
};template<typename T>
class Reference
{
private:/* 使用“指针常量”来模拟引用的行为:1) 只能绑定一个变量;2)必须在初始化才能使用;3)后续的所有赋值都是改变所绑定的变量的值。至于为什么是指针常量,是因为要求,这个指针不能改为指向别的变量!*/T* const pointer;public:Reference(T& object): pointer(&object) {}T& operator = (T& object) {return *pointer = object;}
};int main() {Log test(233);test.display();Reference<Log> ref(test);Log test2(666);ref = test2; // 通过引用改变所绑定的值test.display();return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
输出结果是:
Log 233 Log 666
c++析构相关-待看相关推荐
- Linux面试相关知识点看着一文就够了
今天和大家分享一下linux操作系统下主要用到的几个知识点,分别是:linux目录结构.linux常用命令.文件权限操作.服务操作.yum安装命令.docker服务.vim编译器.pymysql测试连 ...
- iOS相关基础看这篇就够了
响应链 知识点:Responder相关的子类.Runloop 常见提问:在屏幕上点击一个按钮发生了什么? 响应链上的相关继承关系,你为什么可以响应? 继承至UIResponder的才可以响应 NSOb ...
- 【Deep Learning笔记】一个很好的神经网络相关定义(看不懂你来打我)
"神经网络由许多相互关联的概念化的人造神经元组成,它们之间传递相互数据,并且具有根据网络"经验"调整的相关权重.神经元具有激活阈值,如果通过其相关权重的组合和传递给他们的 ...
- String类的构造与析构相关处理
String类原型: 1 Class String 2 { 3 Public: 4 String(const char *str); 5 String(const String &other) ...
- 用户画像相关理论基础 -- 看这一篇就够啦(总结篇)
用户画像基础 什么是用户画像 如何正确理解用户画像 用户画像如何生成 用户画像的标签维度(分类) 标签类型 -- 从标签主题的角度 标签类型 -- 从标签生成的角度 标签类型 -- 从数据提取的角度 ...
- 继承(引用~析构~virtual)
[1]程序1 1 #include <iostream> 2 using namespace std; 3 4 class Base 5 { 6 private: 7 int m_nBas ...
- 看完这个你还不理解右值引用和移动构造 你就可以来咬我(中)
共分三篇,这是第2篇.另外两篇,看完这个你还不理解右值引用和移动构造 你就可以来咬我(上),看完这个你还不理解右值引用和移动构造 你就可以来咬我(下). 看完上篇,应该对右值引用和移动构造有了总体上的 ...
- java特性多态,90%的人看完都说好
01.第一份资料是图解网络 根据读者阅读偏好不同,共出了两个版本风格的 PDF,分别是亮白版本和暗黑版本. 02.第二份资料是计算机的相关知识 看完能让你对计算机有一个基础的了解和入门,是培养你 内核 ...
- CAD教程:CAD看图软件中怎么设置比例?
CAD软件中默认的单位是国际单位毫米(mm),但是一般情况下需要绘制的图形是以米(mm)为单位的,这个时候就需要进行绘图比例的设置.那么在CAD看图软件中怎么进行比例设置呢?接下来的CAD教程小编就来 ...
最新文章
- 在VMware Workstation中安装Ubuntu设置网络连接
- 关于在Flask中使用Restful
- android自定义控件几种,Android 自定义View一个控件搞定多种水波纹涟漪扩散效果 - CSDN博客...
- 字节面试:如何用Redis实现一个分布式锁?
- 深入了解帆软报表系统的启动过程-总结
- 最好用的个人财务管理工具 Money Pro 2.7.4中文版
- 高净值人群依靠什么可以挣那么多钱?
- Skyline软件二次开发初级——10如何在WEB页面中的三维地图上控制图层对象
- linux7输入法切换,centos7如何切换输入法
- 合并报表编制采用的理论_合并报表的基本逻辑是什么?
- 初尝scrapy捉取数据保存到mysql
- 成都拓嘉启远:拼多多万人团要不要去参加
- Non-local:用于捕获长距离依赖关系
- Jetpack Compose 自定义绘制——高仿Keep周运动数据页面
- 简单的一道 SQL 题,谈如何提高编程水平
- 「UG/NX」NX2212手动安装方法教程
- 如何切换笔记本键盘的功能键?
- 借船过河:一个据说能看穿你的人性和欲望的心理测试
- 从月薪 2000 到月入 20 万,我这一路上的可复制与不可复制
- 在两个已经排好序的数组里找出第K小的数