随笔分类 - C++
摘要:第二章 构造/析构/赋值运算 (Constructors,Destructors,and Assignment Operators) 条款5:了解 C++ 默默编写并调用哪些函数 请记住: 编译器可以暗自为 class 创建 default 构造函数、copy 构造函数、copy 赋值运算符和析构函
阅读全文
摘要:第一章 让自己习惯 C++(Accustoming Youself to C++) 条款1:视C++为一个语言联邦 C++是个多重范型编程语言,同时支持过程形式、面向对象形式、函数形式、泛型形式、元编程形式。 视C++为一个语言联邦,包括以下四个部分: C:面向过程的部分 Object-Orient
阅读全文
摘要:c++规定默认参数必须从函数参数的右边向左边使用,如下: 正确: void fun1(int a, int b=10); void fun2(int a, int b=10, int c=20); 错误: void fun3(int a=5, int b, int c); void fun4(int
阅读全文
摘要:1 头文件的布局: 2 #define 保护 所有头文件都应该有 #define 保护来防止头文件被多重包含, 命名格式当是: <PROJECT>_<PATH>_<FILE>_H_ 。 防御式开头防止重复include头文件。 #ifndef COMMON_H #define COMMON_H //
阅读全文
摘要:C vs C++ C是面向过程的,C++是面向对象的,面向对象即是讲一些数据和函数绑定在一起。 对象(classes)的两种经典分类 Class without pointer members complex 拷贝都得一一复制(因为数据成员都包含在对象中了) Class with pointer m
阅读全文
摘要:栈展开(stack unwinding)的定义 抛出异常时,将暂停当前函数的执行,开始查找匹配的 catch 子句。首先检查 throw 本身是否在 try 块内部,如果是,检查与该 try 相关的 catch 子句,看是否可以处理该异常。如果不能处理,就退出当前函数,并且释放当前函数的内存并销毁局
阅读全文
摘要:虚函数指针和虚函数表 虚函数表的定义 多态是由虚函数实现的,而虚函数主要是通过**虚函数表(V-Table)**来实现的。 如果一个类中包含虚函数(virtual修饰的函数),那么这个类就会包含一张虚函数表(vftbl),虚函数表存储的每一项是一个虚函数的地址。在一个对象的内存布局中,指向这张虚函数
阅读全文
摘要:stl中默认堆为大根堆,大根堆的定义为: priority_queue<int> q; 根据源码中的定义,有如下代码: template <class _Tp, class _Container = vector<_Tp>, class _Compare = less<typename _Conta
阅读全文
摘要:deque概述 deque是一种双向开口的“连续”线性空间(即可以在头尾两端分别做元素的插入和删除操作)。 deque与vector的差别: deque允许在常数时间内对头端进行元素的插入和删除操作,vector尾部插入和删除常数时间,头部操作O(n)时间 deque没有容量概念,不需要和vecto
阅读全文
摘要:array底层就是一个定长数组,给定长数组加上迭代器相关的东西,就可以让他像一个容器,符合容器的性质。 #define _NOEXCEPT noexcept template<class _Tp, size_t _Size> struct array { // types: typedef _Tp
阅读全文
摘要:之前写了这样一段代码, printf("%d | %d \n", sizeof(std::list<int>), sizeof(std::list<long long>)); /* 24 | 24 */ 首先我们需要知道list是个什么东东: 点进std::list,可以看到以下代码,可以看出lis
阅读全文
摘要:list概述 list底层为非连续区间,即链表(实质上是一个双向循环链表) list每次插入或者删除一个元素,就配置和释放一个元素空间,对于任何位置的原属插入或原属移除,list永远为常数时间。 list的节点 首先要知道,list本身和list的节点是不同的,如果我们声明一个list,里面放了10
阅读全文
摘要:vector概述 向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。 vector的实现技术,关键在于其对大小的控制以及重新配置时的数据移动效率,即“
阅读全文
摘要:1 C++ 内存配置操作和释放操作 class FOO{}; FOO *pf = new FOO; delete pf; 对于上述代码,其在底层执行内容为: line 2:new操作,首先调用operator new分配内存 (2)调用FooFoo() 构造对象内容; operator new底层调
阅读全文
摘要:const修饰的变量,它的值不能被改变。只能执行不改变其内容的操作。const修饰的变量一样能进行算数运算等操作。 const int bufSize = 512; 如果对其进行修改,则会引发错误。 bufSize = 1024; //error const对象必须初始化 const修饰不具有传递性
阅读全文
摘要:实现一个操作符重载的方式通常有两种情况: 将操作符重载实现为类的成员函数。 操作符重载实现为非类的成员函数(即全局函数)。 将操作符重载实现为类的成员函数 在类体中声明(定义)需要重载的操作符,声明方式跟普通的成员函数一样,只不过操作符重载函数的名字是“关键字operator +以及紧跟其后的一个C
阅读全文
摘要:类型别名 类型别名是一个名字,是某种类型的同义词。使用类型别名可以使复杂的类型名字变得简单明了。 typedef double wages; typedef wages base, *p; //base=double,p=double* C++11中支持新方法: using wages = doub
阅读全文
摘要:引用 引用(reference)为对象起了另外一个名字,引用类型引用(refers to)另外一种类型。通过将声明符写成**&d的形式来定义引用类型型,其中d**是声明的变量名。在初始化变量时,会出现初始值拷贝现象,定义引用则将引用与初始值对象绑定在一起。 引用必须初始化(类型必须严格匹配) 引用并
阅读全文
摘要:2 STL的编程范式 OOP(Object-Oriented Programming):面向对象 数据和操作在同一个类;OOP企图将datas和methods关联在一起 template<class T, class Alloc = alloc> class list{ ... void sort(
阅读全文