![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
天健园扛把子
兴趣遍地都是,专注和持之以恒才是真正稀缺的。
展开
-
成员初始化列表
什么时候使用初始化列表在构造函数中对于对象成员的初始化发生在初始化队列中——或者我们可以把初始化队列直接看做是对成员的定义,而构造函数体中进行的则是赋值操作。所以不难理解有四种情况必须用到初始化列表:当初始化一个引用成员的时候当初始化一个const成员的时候成员对象没有默认构造函数基类对象没有默认构造函数前两者因为要求定义时初始化,所以必须明确的在初始化队列中给它们提供初值。后两者...原创 2019-07-03 21:07:00 · 289 阅读 · 0 评论 -
拷贝构造函数
我们通常认为当一个类为没有定义拷贝构造函数的时候,编译器会为其合成一个,答案是错误的。编译器只有在必要的时候在合成拷贝构造函数。那么编译器什么时候合成,什么时候不合成,合成的拷贝构造函数在不同情况下分别如何工作呢,这是本文的重点。什么时候调用拷贝构造函数显式地将一个类的对象作为另一个对象的初值将实参对象传递给实参对象的时候函数返回一个对象的时候其中后面两个会生成临时对象。编译器何时...原创 2019-07-03 09:04:33 · 160 阅读 · 0 评论 -
深入理解构造函数
我们通常认为:没有定义默认构造函数的类都会被编译器生成一个默认构造函数。编译器生成的默认构造函数会明确初始化类中每一个数据成员。但其实并不是这样。C++ Annoted Reference Manual告诉我们default constructor…在需要的时候被编译器产生出来,那么问题来了,什么时候是需要的时候?C++标准规定:如果类的设计者并未为类定义任何构造函数,那么会有一个默...原创 2019-07-02 20:36:23 · 145 阅读 · 0 评论 -
LeetCode 99 恢复二叉搜索树
题目:二叉搜索树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。示例 1:输入: [1,3,null,null,2] 1 / 3 \ 2输出: [3,1,null,null,2] 3 / 1 \ 2解题思路方法一:最简单也是最暴力的方法,我们看到二叉搜索树,第一反应就应该知道要用中序遍历,于是我们对这棵树进行中序遍...原创 2019-06-22 10:06:05 · 146 阅读 · 0 评论 -
深入剖析struct与class
谈到struct和class的区别,我们的第一反应就是struct也可以和class一样拥有多态,继承的特性,最大的不同只是他们的默认权限不同,struct默认访问权限是public,class默认权限是private,但其实还有一点:memory layout可能不同。struct(没有使用虚函数)的数据成员声明顺序和这些数据成员在内存中的offset一定是一致的。而class只有在POD原则...原创 2019-06-02 10:29:07 · 250 阅读 · 0 评论 -
STL源码剖析之空间配置器
1.空间分配器的标准接口通常,C++内存分配和释放的操作如下:class Foo {...};Foo *pf = new Foo;delete pf;new内含2阶段操作:调用::operator new分配内存调用构造函数构造对象delete也含2阶段操作:调用析构函数析构对象调用::operator delete释放内存STL allocator将new...原创 2019-06-01 13:04:31 · 195 阅读 · 0 评论 -
组合与聚合
类与类之间的三种主要关系Inheritance 继承关系Composition 组合关系Delegation 聚合关系组合**定义:has-a关系,一个类中有包含另一个类,****是包含一个对象,不是包含一个指针。**如何你组合了这个类,那么你将拥有这个类的全部功能1.实例#include<deque>#include <queue>template ...原创 2019-05-27 17:35:19 · 2743 阅读 · 1 评论 -
volatile关键字
volatile提醒编译器它后面所定义的变量随时都可能发生改变,因此编译后的程序每次需要读取这个变量的时候,都会从内存直接读取。如果没有volatile关键字,则编译器可能优化读取和存储,可能展示使用寄存器中的值,如果这个变量由别的程序更新了的话,可能出现不一致现象。一个变量可以既是const又是volatile型的,如只读状态寄存器,是volatile是因为它可能意想不到的被改变,是cons...原创 2019-05-06 11:28:00 · 125 阅读 · 0 评论 -
深入理解快速排序
我们知道快排的核心思想是选取一个基准值,通常我们总是选取最左边的元素作为基准值,并以这个基准值来将数组划为两部分,左边部分为小于基准值,右边部分为小于基准值。但往往我们的数组并不是那么理想的乱序如数组为基本有序的,只有少数元素是有序的此时我们选取最左边的元素作为基准值就可能照成数组的两部分极度不平衡解决办法每次选取基准值时选取一个·随机值数组存在大量的重复元素此时使用...原创 2019-04-24 11:57:34 · 114 阅读 · 0 评论 -
类的几点设计原则
1.即使是一个抽象基类,如果它有非静态数据成员,也应该给它提供一个带参数的构造函数,来初始化它的数据成员。或许你可以通过其派生类来初始化它的数据成员(假如nostatic data member为publish或protected),但这样做的后果则是破坏了数据的封装性,使类的维护和修改更加困难。由此引申,类的data member应当被初始化,且只在其构造函数或其member function中...原创 2019-07-05 17:35:07 · 219 阅读 · 0 评论