
C++
文章平均质量分 60
阿龙-
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
阿龙的学习笔记---转载及精炼总结github仓库:cpp-backend-reference
转载自https://github.com/chankeh/cpp-backend-reference突击复习常见题,要提前批了,之前的忘了不少,知识广度先再拓展一下。文章中的一些详细讲解的链接可以深度学习。后端开发面试知识点大纲:语言类(C++):关键字作用解释:volatile作用Volatile关键词的第一个特性:易变性。所谓的易变性,在汇编层面反映出来,就是两条语句,下一条语句不会直接使用上一条语句对应的volatile变量的寄存器内容,而是重新从内存中读取。Vola.转载 2021-07-03 15:37:04 · 443 阅读 · 0 评论 -
阿龙的学习笔记---《STL源码剖析》---(一)
《STL源码剖析》读书笔记。原创 2021-06-28 17:21:17 · 143 阅读 · 0 评论 -
阿龙的学习笔记---CMake指定C++版本
主要参考这个文章: https://cloud.tencent.com/developer/article/1741243调试毕业设计程序,编译安装库时遇到的问题:说98版本不支持long long/home/l/software/octomap-devel/octomap/include/octomap/OccupancyOcTreeBase.hxx:964:46: error: ISO C++ 1998 does not support ‘long long’ [-Werror=long-l.原创 2021-05-31 13:55:41 · 2407 阅读 · 0 评论 -
阿龙的学习笔记---《深度探索C++对象模型》读书笔记(五)--- 构造、析构、拷贝语意学
一个 pure virtual destructor 纯虚析构函数 需要被定义,因为编译器会在derived类中静态调用他。所以一般不要把虚析构函数声明为纯虚。不要把不会呗重写的函数声明为虚函数,因为效率上没有静态函数高,并且不能被inline所优化。虚函数在设计为const的时候,需要谨慎,因为你不知道derived class 会不会修改成员变量,所以建议是最好不要声明为const。无继承情况下的构造Plain Old Data (POD) POD 指的是这样一些数据类型:基本数据类型、指.原创 2021-04-17 16:28:04 · 118 阅读 · 0 评论 -
阿龙的学习笔记---《深度探索C++对象模型》读书笔记(四)--- Function语意学
各种调用方式class中有三种function可以调用:static、non-static、virtual,是有差异的。非静态成员函数:Nonstatic Member functionsC++设计准则是:应该与非成员函数的开销一样。所以其实调用时,会转换为非成员函数的形式,会将object通过this指针的方式传入。成员变量的读取也会转换为this指针的操作。转换之后可能会加上前文提到的NRV优化,以及名称的特殊处理(Name mangling)即重新按照一定的规则命名。虚拟成员原创 2021-04-16 18:37:10 · 143 阅读 · 0 评论 -
阿龙的学习笔记---《深度探索C++对象模型》读书笔记(三)--- Data语意学
占用空间: 空的基类是1字节的大小,由于编译器需要使得不同的对象有不同的地址,以及其他因素,会给空的class一个char,分配空间。如果继承这个类,那么可能会占用这1字节的空间,但新的编译器可能会优化掉,比如在32位机器上,以下两种可能性:同名: 外部声明的同名变量,一般会被class内部的变量覆盖。内存中 顺序: non-static data members 在 class object 中的排列顺序将和其被声明的顺序一样。...原创 2021-04-16 00:28:31 · 128 阅读 · 0 评论 -
阿龙的学习笔记---《深度探索C++对象模型》读书笔记(二)--- 构造函数语义学
默认构造函数:什么是trival-default constructor,什么是non-trival default constructor两者的差别在哪?简单言之,trival的默认构造函数只是能让代码通过编译,而其它什么事都不做,而non-trival的默认构造函数则相反,non-trival的构造函数还会进行一些其它的动作,比如初始化class object的virtual function table。并不是我们所理解的任何没有构造函数的类都会自动创建,不需要的时候只是有trival原创 2021-04-15 19:47:52 · 173 阅读 · 0 评论 -
阿龙的学习笔记---《深度探索C++对象模型》读书笔记(一)--- 关于对象
《深度探索C++对象模型》,好书! 但好早以前看的了,这次面试一个虚继承和多重继承的题没答上来,才想起来看这本书的时候,一扫而过,也没有记笔记,所以印象不深,这两天总结一下~原创 2021-04-15 17:53:19 · 123 阅读 · 0 评论 -
阿龙的学习笔记---算法题C++数据结构/算法/功能/处理输入输出等(转载总结)
STL及常用函数常用STL数据结构及函数: https://blog.youkuaiyun.com/fantacy10000/article/details/95974634常用算法C++实现及STL常用API: https://blog.youkuaiyun.com/CodeAddict/article/details/85614087#_STL_some_demos_1算法竞赛中常用的C++ STL: https://blog.youkuaiyun.com/qq_34489943/article/details/79771371原创 2021-04-01 16:31:09 · 194 阅读 · 0 评论 -
阿龙的学习笔记---《Effective STL》读书笔记(三)
条款22:避免原地修改set和multiset的键正如所有标准关联容器,set和multiset保持它们的元素有序,这些容器的正确行为依赖于它们保持有序。 如果你改了关联容器里的一个元素的值(例如,把10变为1000),新值可能不在正确的位置。正确做法:找到想要修改的元素,做一份拷贝,修改拷贝值,删除原来元素,添加修改后的新元素。这样,重新插入的时候还会进行新的排序。条款23:考虑用排序的vector代替关联容器vector比起关联容器,效率高很多。这适用于当你最开始初始化vecto原创 2020-12-01 19:23:17 · 156 阅读 · 0 评论 -
阿龙的学习笔记---《Effective STL》读书笔记(二)
####0 条款12: 切勿依赖STL的线程安全性对于一个STL,最多期望:多个线程对容器的读是安全的;多个线程对不同容器的写是安全的。而且上述是最多期望这个,甚至有些stl中还不支持以上的内容。所以程序员需要自己做同步控制:对一个容器的成员函数的调用,每次都锁住容器。对于每个返回的迭代器的生存期间内,都锁住对于算法的运行,锁住容器。锁的使用可以参考Effective C++中使用一个类来实现。条款13:vector和string优先于动态分配的数组使用new操作符原创 2020-12-01 13:22:17 · 165 阅读 · 0 评论 -
阿龙的学习笔记---《Effective STL》读书笔记(一)
读了《Effective STL》,记录一下。条款1:仔细选择你的容器标准STL序列容器:vector、string、deque和list。标准STL关联容器:set、multiset、map和multimap。连续内存容器在一个或多个(动态分配)的内存块中保存它们的元素。如果一个新元素被查入或者已存元素被删除,其他在同一个内存块的元素就必须向上或者向下移动来为新元素提供空间或者填充原来被删除的元素所占的空间。这种移动影响了效率(参见条款5和14)和异常安全(就像我们将会看到的)。标准的连续内存容原创 2020-11-30 21:08:58 · 130 阅读 · 0 评论 -
阿龙的学习笔记---STL学习---删除元素:remove和remove_if函数,以及erase-remove用法
STL删除元素remove() & remove_if()remove和remove_if只是通过迭代器的指针向前移动来删除,将没有被删除的元素放在链表的前面,并返回一个指向新的尾值的迭代器。由于remove()函数不是成员,因此不能调整链表的长度。remove函数原型如下:template< class ForwardIt, class T >ForwardIt remove(ForwardIt first, ForwardIt last, const T& valu原创 2020-11-25 15:38:12 · 303 阅读 · 0 评论 -
阿龙的学习笔记---《程序员自我修养-链接、装载与库》读书笔记(一)
记录笔记,因为看了好久还没看完…真的是,但是虽然后面的没看完,但我前面的页快忘完了呀,记录一下吧还是。一、 温故而知新从计算机组成原理之类的开始讲,说明这部分还是蛮重要的,虽然也快忘完了。讲到操作系统,这个的确也与程序运行息息相关。讲到了一个线程安全与编译器的问题,虽然放在这怪怪的,但是很有趣:虽然如我们一般所知,加锁是可以在简单情况下保证线程安全的,但是假如编译器为了提高运行速度而优化,假如将一个变量先放在了寄存器中,然后暂时不写回,过了一段时间才写回内存,那么这个就会有问题了,即使正.原创 2020-10-23 20:29:09 · 236 阅读 · 0 评论 -
阿龙的学习笔记---C++ 进阶知识(博客汇总)
1. C++11 - 右值引用和Move语义讲解了C++中的左值和右值,从C开始将起,主要是自定义类型的问题。https://www.cnblogs.com/catch/p/3500678.html这篇文章又更详细了讲了左右值:https://blog.youkuaiyun.com/xuwqiang1994/article/details/79924310常量左值引用(const &)可以被赋右值。因为它们是常量,不能通过引用被修改。而右值引用(C++11特性)是( && ),可以更原创 2020-06-26 22:07:19 · 221 阅读 · 0 评论 -
阿龙的学习笔记---常见设计模式---观察者模式
观察者模式观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种交互也称为发布-订阅(publish-subscribe)。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者。观察者需要有传输信息的函数,供被观察者调用来通知他。被观察者要有一个观察者队列,所有观察者需要在这个队列中注册。数据变化时,通过队列中的观察者,调用传输消息的函数。代码实现#include <iostream>#include <原创 2020-06-22 16:44:04 · 150 阅读 · 0 评论 -
阿龙的学习笔记---常见设计模式---工厂模式
工厂模式特点:定义创建对象的接口,封装了对象的创建;使得具体化类的工作延迟到了子类中。简单工厂模式通过一个工厂类来创建某一类产品,创建函数返回值为这一类产品的抽象基类指针(或引用)。组成:1)工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。2)抽象产品角色:它一般是具体产品继承的父类或者实现的接口。3)具体产品角色:工厂类所创建的对象就是此角色的实例。缺点:每增加一个基类,都要对工厂进行修改,这样不太好,不满足开闭原则(虽然也不知道原则是什么)例如肥皂有一个基原创 2020-06-22 16:33:01 · 122 阅读 · 0 评论 -
阿龙的学习笔记---常见设计模式---单例模式
单例模式保证一个类只有一个实例,并提供一个访问它的全局访问点。设计思路:要保证没有多个实例,则不能让他构造,隐藏构造函数为private。那么再提供一个类内static对象,提供一个public static函数提供全局访问点。代码实现:第一种: 按照上面的思路最简单的设计方式。但是没有考虑到多线程,如果多个进程都进入了if (m_Instance == NULL),那么则会运行多次new操作,则不是单例了。class Singleton{public: static Singleton原创 2020-06-22 16:11:51 · 122 阅读 · 0 评论 -
阿龙的学习笔记---More Effective C++---第四章:效率
本章阐述能够帮助程序提高效率的几个tips。16. 谨记80-20法则80-20法则是说:一个程序的80%的资源都用在20%的代码上。重点就是:软件的整体性能几乎由其构成要素的一小部分决定。所以提高性能重要的是:找到瓶颈。大部分人的错误做法就是 “猜” ,这并不能引导你走向20%的瓶颈。好的方法是借助程序分析器,测量你所在意的数据。比如时间效率,那么就使用分析器分析每个程序段运行的时间、或者某些函数被调用的次数等。分析器需要好的数据来分析,假如运行出问题,那么将问题复现,无法重现的数据意原创 2020-05-16 19:06:13 · 236 阅读 · 0 评论 -
阿龙的学习笔记---More Effective C++---第三章:异常Exception
前言 exception异常无法被忽略,其他方式例如“返回状态码”或者“设置状态变量”等方式,不能保证调用者一定会按照这样的方式使用。而抛出异常,如果不处理,程序则会自动停止。而设计“exception-safe”的程序也需要一定的章程。9. 利用析构函数避免资源泄露本章所讲的就是智能指针的思路,在一段程序中,new和delete之间如果抛出了exception但没有被catch,那么程序会立刻终止,但是资源并没有被delete,造成了资源的泄露。但是局部变量在程序终止时仍然会调用其析..原创 2020-05-13 18:53:26 · 303 阅读 · 0 评论 -
阿龙的学习笔记---More Effective C++---第二章:操作符
5.6. 区别++ 和 - - 操作符的前置后置形式重载函数写法区分:由于两者的符号都是++,但是前置和后置又是两个函数,所以用一个奇葩方式区别,即参数列表中是否有一个int参数。参数无任何意义,编译器在调用时传入一个0 。class myInt{··· myInt& operator++(); //前置,即++i const muInt operator++(int); //后置,即i++}函数返回值差异:前置的 ++i 返回值为reference,因为是加过..原创 2020-05-12 17:42:33 · 175 阅读 · 0 评论 -
阿龙的学习笔记---More Effective C++---第一章:基础议题
1. 仔细区别 reference 和 pointerreference不能为空,pointer可以,所以reference可以直接用,pointer要判断是否为NULL。reference 指向后则不能变了,pointer还可以指向不同的元素。2. 最好使用C++转换操作符这个在《程序员面试宝典》的总结(1)中写过四种C++类型转换的用途,详见阿龙的学习笔记—《程序员面试宝典》阅读笔记(1)3. 绝不以多态方式处理数组多态方式一般都是以 base类的指针 指..原创 2020-05-11 01:35:34 · 222 阅读 · 0 评论 -
阿龙的学习笔记---《程序员面试宝典》阅读笔记
第五章:程序设计基本概念函数传参顺序一般是从右到左C++编译器默认使用的是 __cdecl 模式(还有stdcall、pacal等标准),参数是通过栈传递的,因此是从右到左的传参顺序。int f(int a, int b, int c){ return 0;}int main(){ return f(printf("a"),printf("b"),printf...原创 2020-05-08 13:37:02 · 207 阅读 · 0 评论 -
阿龙的学习笔记---C++---将 char 转换为 string
string 有以 char* 为参数的构造函数,但没有以“char”为参数的构造函数。所以将一个单个 char转换为string则较为麻烦。将char转为string的方法如下:char c;string str;stringstream stream;stream << c;str = stream.str();如果是要将一个char字母插入到strin...原创 2020-05-05 22:55:17 · 190 阅读 · 0 评论 -
阿龙的学习笔记---Effective C++---第8章:定制new和delete---未完
C++手动管理内存,而不像Java,.NET是自动管理。这一章主要讨论内存管理例程的行为,主要是分配例程operator new和归还例程operator delete多线程下的内存管理更为复杂,如果没有适当的同步控制,则会导致一些内存败坏。注意operator new和operator new[]的不同(以及delete),下文中大部分二者都适用。STL中大多有其自己的分配器对象管理,而不...原创 2020-04-22 16:06:57 · 150 阅读 · 0 评论 -
阿龙的学习笔记---Effective C++---第7章和第8章
第7章:模板与泛式编程第8章:定制new和delete这俩感觉有些深奥,见得不太多,先补补别的知识,这些之后再看吧。四舍五入就算《Effective C++》完结撒花了。...原创 2020-04-22 13:52:45 · 189 阅读 · 0 评论 -
阿龙的学习笔记---Effective C++---第六章:继承与面向对象设计
条款32:确定你的public继承出is-a关系公开继承public inheritance代表一种is-a关系,D是B的继承,那么B是一种更一般化的概念,而D是一种特殊化的概念。B可以实现的,D一定可以实现,这才是is-a关系。比如square正方形与rectangle矩形之间的关系,在数学上来说,正方形就是一种矩阵。但是假如在面向对象中表示呢?假如rectangle可以随意...原创 2020-04-17 14:11:08 · 223 阅读 · 0 评论 -
阿龙的学习笔记---Effective C++---第五章:实现-Implementations
大多数情况下,提出class定义以及function声明,是花费心力较多的事儿。条款26:尽量延后变量定义式的时间在程序到达定义变量式的地方,以及离开作用域,会承担变量的构造和析构成本。如果这个变量没有被用到,则会浪费这些成本,所以变量的定义尽量延后。变量未被用到,可能因为在前面有return,或者抛出异常。变量的定义最好在需要他的地方。变量定义最好能够直接初始化,而不是定义...原创 2020-04-16 13:44:52 · 270 阅读 · 0 评论 -
阿龙的学习笔记---Effective C++---第四章:设计与声明
这一章是在说C++接口开发中是设计与声明方面的问题。如何让接口更容易被使用,更不容易使用出错。条款18:让接口容易被正确使用,不容易被误用理想上,用户使用某个接口,误用的用法不该通过编译,因此在设计时,要考虑到用户可能出的错误。假如设计一个日期class,构造函数中要传入“年”“月”“日”三个参数,那么设计中要考虑到输入的顺序啊,取值的范围等。如果单纯使用int类型作为传入...原创 2020-04-13 18:52:13 · 173 阅读 · 0 评论 -
阿龙的学习笔记---Effective C++---第三章、资源管理
所谓资源就是,一旦用了它,将来必须还给系统。如果不这样,糟糕的事情就会发生。 C++程序中最常使用的资源就是动态分配内存(如果你分配内存却从来不曾归还它,会导致内存泄露), 但内存只是你必须管理的众多资源之一。其他常见的资源还包括文件描述符(file description),互斥锁(mutex lock),图形界面中的字型和笔刷,数据库连接,以及网络socket。 不论哪一种资源,最重要...原创 2020-04-11 19:56:36 · 193 阅读 · 0 评论 -
阿龙的学习笔记---Effective C++---第二章、构造 / 析构 / 赋值运算
第二章、构造 / 析构 / 赋值运算条款05:了解C++默默为class创建并调用哪些函数如果定义一个空类 class empty{}; C++会自动为其创建默认构造函数、一个non-virtual析构函数、copy构造函数、copy-assignment 拷贝赋值运算符这四个函数。class Empty{};//相当于class Empty{public: Empty(){} ...原创 2020-04-08 13:43:17 · 206 阅读 · 0 评论 -
阿龙的学习笔记---哈希表与C++11中unordered_map学习笔记
散列表(Hash table,也叫哈希表),是根据 关键码值(Key value) 而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 给定表M,存在函数H(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数H...原创 2020-02-22 21:35:35 · 379 阅读 · 0 评论 -
阿龙的学习笔记---Effective C++---第一章:习惯C++
第一章:习惯C++条款1:视C++为一个语言联邦C++发展至今已经不只是C with classes的概念了,他是一个多重范式的编程语言。可将其视为一个多重语言的联邦。C++的次语言被总结为以下4个:C语言。说到底C++仍是以C为基础。区块( blocks)、语句( statements)、预处理器( preprocessor)、内置数据类型( built-in data typ...原创 2020-04-06 16:00:37 · 266 阅读 · 1 评论 -
阿龙的学习笔记---C++中的静态绑定和动态绑定
为了支持c++的多态性,才用了动态绑定和静态绑定。理解他们的区别有助于更好的理解多态性。对象的静态类型:对象在声明时采用的类型。是在编译期确定的。对象的动态类型:目前所指对象的类型。是在运行期决定的。对象的动态类型可以更改,但是静态类型无法更改。class B{}class C : public B{}class D : public B{}D* pD = ne...原创 2020-04-04 19:05:54 · 152 阅读 · 0 评论