摘要:0x01 智能指针简介 所谓智能指针(smart pointer)就是智能/自动化的管理指针所指向的动态资源的释放。它是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。 使用
阅读全文
摘要:https://bbs.pediy.com/thread-222967.htm 环境:VS2015 (x86) 0x01 结构体的内存对齐 先看这个例子: 输出的sizeof(Monster)的值为12,来看看结构体MonsterObject的内存: 结构体中的第一个和第三个成员虽然是char类型只
阅读全文
摘要:0x01 菱形继承 假设有类B和类C,它们都继承了相同的类A。另外还有类D,类D通过多重继承机制继承了类B和类C。 如果直接继承会引发访问不明确(二义性),以及数据冗余。如果直接指定访问对象,可解决二义性,而要解决数据冗余,则要引入虚函数。 因为图表的形状类似于菱形(或者钻石),因此这个问题被形象地
阅读全文
摘要:// DeleteAndDelete[].cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include using namespace std; /* delete ptr 只用来释放ptr指向的内存。 delete[] ptr 用来释放rg指向的内存,并且逐一调用数组中每个对象的析构函数 ...
阅读全文
摘要:0x01 const & define区别 宏定义#define发生在预编译期,而const,enum定义的常量发生在编译期,两者的重要差别在于编译期里的变量是进符号表的,而预编译期的宏是简单的替换,不进符号表。 宏#define没有数据类型,只是用来做文本替换,存在于程序的代码段,是一个Compi
阅读全文
摘要:存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量。 0x01 (普通)全局变量与静态全局变量 (隐藏) 未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问,全局变量名或者函数名前加stati
阅读全文
摘要:// ShStringNew.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include using namespace std; class SHString { public: SHString(const char* Str = "") :mStr(new char[strlen(Str) + 1]) { st...
阅读全文
摘要:#include using namespace std; template struct ListNode { T Data; ListNode* Flink; ListNode() { Flink = NULL; } ListNode(T SHData, ListNode* SHFlink = NULL) { Data = SHData; Flink = SHFlink;...
阅读全文
摘要:0x01 概念 单例模式最初的定义出现于《设计模式》(艾迪生维斯理):“保证一个类仅有一个实例,并提供一个访问它的全局访问点。” 单例模式该的实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实例的构造是一个pub
阅读全文
摘要:1.从虚函数的调用机制上看,如果构造函数为虚函数的话,那函数地址将存储在虚表,将由虚表指针来访问续表,而虚表指针是类对象的第一个数据成员,类对象又要由构造函数产生,所以构造函数不能是虚函数。 2.从构造函数的作用来看,构造函数的作用是提供初始化,在对象生命期只执行一次,不是对象的动态行为,也没有必要
阅读全文
摘要:1.重载:overload,是指同一可访问区内被声明的几个具有不同参数列表(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型。 2.隐藏(重定义):隐藏是指派生类的函数屏蔽了与其同名的基类函数。注意只要同名函数,不管参数列表是否相同,基类函数都会被隐藏。
阅读全文
摘要:C++多态的实现原理,一言以蔽之:在父类中存在虚函数(virtual),如果在子类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。由于虚函数的存在,编译器实行运行时绑定的机制,如果运行时实际指向的对象类型是子类的对象,就调用子类的虚函数;如果运行时实际指向的对象类型是父类的对象,就调用父
阅读全文
摘要:继续从汇编内存层次上对虚表和虚表指针进行分析 (任何妄图使用父类指针想调用子类中的未覆盖父类的成员函数的行为都会被编译器视为非法) 0x01 对象调用自身虚函数 反汇编: 虚函数SetNumber()反汇编分析:、 可以看到,虚函数与普通函数的实现流程并无差别,并没有看到虚表指针之类的操作。 也就是
阅读全文
摘要:编译器:VS2015 0x01 基础概念 首先还是简单重复一下基础概念。 C++的多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。 1、多态性 指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多
阅读全文
摘要:0x01 对象的静态类型和动态类型 静态绑定和动态绑定 对象的静态类型:对象在声明时采用的类型。是在编译期确定的 对象的动态类型:目前所指对象的类型。是在运行期决定的。对象的动态类型可以更改,但是静态类型无法更改 静态绑定:绑定的是对象的静态类型,某特性(比如函数)依赖于对象的静态类型,发生在编译期
阅读全文
摘要:一个错误报告日志的框架,编译成动态库,不过功能还不够完善。 利用C++输出文件流的类ofstream 来实现日志记录功能: 使用ios::out和ios::app的方式打开(文件以输出方式打开(内存数据输出到文件);以追加方式打开文件) 效果: 源代码: 1 #pragma once 2 #incl
阅读全文
摘要:floor(x) is the largest integer not greater than x , 也就是,floor(x) 返回的是小于等于x的所有整数中最大的整数,简单的说,就是去掉x的小数部分的整数ceil(x) is the smallest integer not less than
阅读全文
摘要:注:本文内容来源于zhice163博文,感谢作者的整理。 1.为什么基类的析构函数是虚函数? 在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。 下面转自网络:源地址 http://blog.sina.com.cn/s/blog_7c773cc50100y9hz.ht
阅读全文