原文: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++析构相关-待看相关推荐

  1. Linux面试相关知识点看着一文就够了

    今天和大家分享一下linux操作系统下主要用到的几个知识点,分别是:linux目录结构.linux常用命令.文件权限操作.服务操作.yum安装命令.docker服务.vim编译器.pymysql测试连 ...

  2. iOS相关基础看这篇就够了

    响应链 知识点:Responder相关的子类.Runloop 常见提问:在屏幕上点击一个按钮发生了什么? 响应链上的相关继承关系,你为什么可以响应? 继承至UIResponder的才可以响应 NSOb ...

  3. 【Deep Learning笔记】一个很好的神经网络相关定义(看不懂你来打我)

    "神经网络由许多相互关联的概念化的人造神经元组成,它们之间传递相互数据,并且具有根据网络"经验"调整的相关权重.神经元具有激活阈值,如果通过其相关权重的组合和传递给他们的 ...

  4. String类的构造与析构相关处理

    String类原型: 1 Class String 2 { 3 Public: 4 String(const char *str); 5 String(const String &other) ...

  5. 用户画像相关理论基础 -- 看这一篇就够啦(总结篇)

    用户画像基础 什么是用户画像 如何正确理解用户画像 用户画像如何生成 用户画像的标签维度(分类) 标签类型 -- 从标签主题的角度 标签类型 -- 从标签生成的角度 标签类型 -- 从数据提取的角度 ...

  6. 继承(引用~析构~virtual)

    [1]程序1 1 #include <iostream> 2 using namespace std; 3 4 class Base 5 { 6 private: 7 int m_nBas ...

  7. 看完这个你还不理解右值引用和移动构造 你就可以来咬我(中)

    共分三篇,这是第2篇.另外两篇,看完这个你还不理解右值引用和移动构造 你就可以来咬我(上),看完这个你还不理解右值引用和移动构造 你就可以来咬我(下). 看完上篇,应该对右值引用和移动构造有了总体上的 ...

  8. java特性多态,90%的人看完都说好

    01.第一份资料是图解网络 根据读者阅读偏好不同,共出了两个版本风格的 PDF,分别是亮白版本和暗黑版本. 02.第二份资料是计算机的相关知识 看完能让你对计算机有一个基础的了解和入门,是培养你 内核 ...

  9. CAD教程:CAD看图软件中怎么设置比例?

    CAD软件中默认的单位是国际单位毫米(mm),但是一般情况下需要绘制的图形是以米(mm)为单位的,这个时候就需要进行绘图比例的设置.那么在CAD看图软件中怎么进行比例设置呢?接下来的CAD教程小编就来 ...

最新文章

  1. 在VMware Workstation中安装Ubuntu设置网络连接
  2. 关于在Flask中使用Restful
  3. android自定义控件几种,Android 自定义View一个控件搞定多种水波纹涟漪扩散效果 - CSDN博客...
  4. 字节面试:如何用Redis实现一个分布式锁?
  5. 深入了解帆软报表系统的启动过程-总结
  6. 最好用的个人财务管理工具 Money Pro 2.7.4中文版
  7. 高净值人群依靠什么可以挣那么多钱?
  8. Skyline软件二次开发初级——10如何在WEB页面中的三维地图上控制图层对象
  9. linux7输入法切换,centos7如何切换输入法
  10. 合并报表编制采用的理论_合并报表的基本逻辑是什么?
  11. 初尝scrapy捉取数据保存到mysql
  12. 成都拓嘉启远:拼多多万人团要不要去参加
  13. Non-local:用于捕获长距离依赖关系
  14. Jetpack Compose 自定义绘制——高仿Keep周运动数据页面
  15. 简单的一道 SQL 题,谈如何提高编程水平
  16. 「UG/NX」NX2212手动安装方法教程
  17. 如何切换笔记本键盘的功能键?
  18. 借船过河:一个据说能看穿你的人性和欲望的心理测试
  19. 从月薪 2000 到月入 20 万,我这一路上的可复制与不可复制
  20. 在两个已经排好序的数组里找出第K小的数

热门文章

  1. https 证书验证等原理
  2. mysql中的表连接知识点_Mysql知识点总结
  3. 弧形背景html,JS实现带圆弧背景渐变效果的导航菜单代码
  4. 计算机 采购,计算机采购
  5. Linux 实时查看日志文件的 4 种方法
  6. 皮一皮:学霸和学渣的区别
  7. 用了5年的Git,你竟然还不晓得它的实现原理!
  8. Java 必会的 9 大技能,我请部门大神给你讲讲
  9. 系统设计经典题:手把手教你搭建一个IM(即时通讯) 系统
  10. TCP之三次握手四次挥手 1