C++
文章平均质量分 87
南方以北
这个作者很懒,什么都没留下…
展开
-
《Effective C++》学习笔记
Effective C++视C++为一个语言联邦尽量以const、enum、inline替换#define视C++为一个语言联邦可以将C++视为一个由许多次语言组成的联邦:CObject-Oriented C++Template C++STL每个次语言都有自己的规约。尽量以const、enum、inline替换#define可以理解为“宁可以编译器替换预处理器”。例如对于#define ASPECT_RATIO 1.653,当你运用此常量但获得一个编译错误时,可能会带来困惑,因为这个原创 2020-08-16 18:33:51 · 867 阅读 · 0 评论 -
《高质量程序设计指南--C/C++语言》学习笔记
《高质量程序设计指南--C/C++语言》学习笔记一般地,软件设计应该将“设备相关程序”与“设备无关程序”分开,将“功能模块”与“用户界面”分开,这样可以提高可移植性。尽可能复用你所能复用的东西。修改错误代码时的注意事项:发现错误时不要急于修改,先思考一下修改此代码会不会引发其他问题。考虑是否还有同类型的其他错误。不论原有程序是否绝对正确,只要对此程序做过改动(哪怕是微不足道的),都要进行回归测试。对于以源代码形式提供的库,必须使用当前的编译器对其重新编译;如果是二进制级的库,除非它的开发商原创 2020-06-13 17:13:56 · 1517 阅读 · 0 评论 -
C++ Primer 学习笔记 总目录
C++ Primer第一章 快速入门第二章 变量和基本类型第一章 快速入门《C++ Primer》学习笔记(一):快速入门第二章 变量和基本类型《C++ Primer》学习笔记(二):变量和基本类型...原创 2020-05-30 12:29:24 · 1019 阅读 · 0 评论 -
《C++ Primer》学习笔记(十六):模板与泛型编程
《C++ Primer》学习笔记(十六):模板与泛型编程定义模板函数模板定义模板函数模板template <typename T>int compare(const T &v1, const T &v2){ if(v1 < v2) return -1; if(v2 < v1) return 1; return 0;}...原创 2020-05-29 09:14:35 · 593 阅读 · 0 评论 -
《C++ Primer》学习笔记(十五):面向对象编程
《C++ Primer》学习笔记(十五):面向对象编程抽象基类访问控制与继承面向对象编程的核心思想是数据抽象、继承和动态绑定。在C++语言中,当我们使用基类的引用(或指针)调用一个虚函数时将发生动态绑定。派生类经常(但不总是)覆盖它继承的虚函数。如果派生类没有覆盖基类中的某个虚函数,则该虚函数的行为类似于其他的普通成员,派生类会直接继承其在基类中的版本。派生类可以在它覆盖的函数前使用virtual关键字,但不是一定要这么做。也可以在函数的形参列表后面添加一个关键字override关键字来说明。如果我原创 2020-05-26 17:48:42 · 584 阅读 · 0 评论 -
《C++ Primer》学习笔记(十四):重载运算与类型转换
《C++ Primer》学习笔记(十四):重载运算与类型转换输入和输出运算符算术和关系运算符赋值运算符下标运算符递增和递减运算符成员访问运算符当一个重载的运算是成员函数时,this绑定到左侧运算对象。成员运算符函数的(显式)参数数量比运算对象的数量少一个。//一个非成员函数的等价调用data1 + data2; //普通的表达式operator+(data1, data2); //等价的函数调用data1 += data2; //基于“调用的表达式”data1.operator+=(data原创 2020-05-24 12:09:05 · 582 阅读 · 0 评论 -
《C++ Primer》学习笔记(十三):拷贝控制
《C++ Primer》学习笔记(十三):拷贝控制拷贝、赋值与销毁拷贝构造函数拷贝赋值运算符析构函数三/五法则使用=default拷贝、赋值与销毁拷贝构造函数如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数。虽然可以定义一个接受非const引用的拷贝构造函数,但是一般都是使用const引用作为参数。拷贝构造函数在几种情况下都会被隐式调用,因此一般不应是explicit的。拷贝赋值运算符class Foo{public: Foo& op原创 2020-05-23 12:14:32 · 452 阅读 · 0 评论 -
《C++ Primer》学习笔记(十二):动态内存
《C++ Primer》学习笔记(十二):动态内存动态内存与智能指针shared_ptr内存耗尽shared_ptr与new结合使用智能指针和异常unique_ptrweak_ptr动态数组allocator类程序用堆来存储动态分配的对象,当动态对象不再使用时,我们的代码必须显式地销毁它们。动态内存与智能指针C++中动态内存的管理是通过new和delete来完成的。为了更安全地使用动态内存,提供了两种智能指针类型来管理动态对象,均定义在memory头文件中。shared_ptr:允许多个指针指向同原创 2020-05-20 17:09:48 · 488 阅读 · 0 评论 -
《C++ Primer》学习笔记(十一):关联容器
《C++ Primer》学习笔记(十一):关联容器使用关联容器定义关联容器关键字类型的要求pair类型关联容器迭代器关联容器中的元素是按关键字来保存和访问的。map中保存的是键值对(key-value),关键字起索引所用,值则保存相应的数据。set中的每个元素只包含一个关键字,支持高效的关键字查询操作。map和multimap定义在头文件map中,set和multiset定义在头文件set中。无序容器定义在unordered_map和unordered_set中,无序容器使用哈希函数来组织元素。原创 2020-05-19 10:47:27 · 609 阅读 · 1 评论 -
《C++ Primer》学习笔记(十):泛型算法
《C++ Primer》学习笔记(十):泛型算法初识泛型算法只读算法写容器元素的算法重排容器元素的算法定制操作向算法传递函数lambda表达式泛型算法是一组公共接口,可以用于不同类型的元素和多种容器类型。泛型算法本身不会执行容器的操作,只会运行于特定迭代器上,执行迭代器的操作,即不会改变底层容器的大小。但是标准库定义了一类特殊的迭代器:插入器(inserter)。与普通迭代器只能遍历所绑定的容器相比,插入器能做更多的事情。当给这类迭代器赋值时,它们会在底层的容器上执行插入操作。因此当一个算法操作这样的迭原创 2020-05-17 16:26:41 · 700 阅读 · 1 评论 -
《C++ Primer》学习笔记(九):顺序容器
《C++ Primer》学习笔记(九):顺序容器容器库概述容器定义和初始化赋值和swap顺序容器为程序员提供了控制元素存储和访问顺序的能力,这种顺序与元素加入容器时的位置相对应。而与之相对的,关联容器则是根据关键字的值来存储元素。容器库概述容器选择基本原则:除非有合适的理由选择其他容器,否则应该使用 vector。如果程序有很多小的元素,且空间的额外开销很重要,则不要使用 list...原创 2020-05-09 19:17:44 · 437 阅读 · 0 评论 -
《C++ Primer》学习笔记(八):IO库
《C++ Primer》学习笔记(八):IO库IO类IO象无拷贝或赋值条件状态管理输出缓冲文件输入输出使用文件流对象IO类头文件iostream 定义了用于读写流的基本类型,fstream 定义了读写命名文件的类型,sstream 定义了读写内存中 string对象的类型。为了支持使用宽字符的语言,标准库定义了一组类型和对象来操纵wchar_t类型的数据。宽字符版本的类型和函数的名字以一个...原创 2020-05-01 12:08:24 · 531 阅读 · 0 评论 -
《C++ Primer》学习笔记(七):类
《C++ Primer》学习笔记(七):类原创 2020-04-30 12:04:56 · 511 阅读 · 0 评论 -
《C++ Primer》学习笔记(六):函数
《C++ Primer》学习笔记(六):函数函数基础局部对象函数声明分离式编译参数传递数组形参main:处理命令行选项含有可变形参的函数返回数组指针函数基础一个典型的 函数(function) 定义包括:返回类型(return type)、函数名字、由0个或多个形式参数(parameter,简称形参)组成的 列表 和 函数体(function body)。函数执行的操作在语句块中说明,即函数体...原创 2020-04-27 17:21:33 · 380 阅读 · 0 评论 -
《C++ Primer》学习笔记(五):语句
《C++ Primer》学习笔记(五):语句switch语句迭代语句for循环执行顺序try语句块和异常处理throw表达式try语句块标准异常switch语句不允许跨过变量的初始化语句直接跳转到该变量作用域内的另一个位置。如果需要为 switch 的某个 case 分支定义并初始化一个变量,则应该把变量定义在块内。case true: { // 正确:声明语句位于语句块内部...原创 2020-04-25 10:24:44 · 465 阅读 · 0 评论 -
《C++ Primer》学习笔记(四):表达式
《C++ Primer》学习笔记(四):表达式左值和右值求值顺序算数运算符逻辑和关系运算符赋值运算符递增和递减运算符成员访问运算符左值和右值当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。使用关键字decltype的时候,如果表达式的求值结果是左值,decltype作用于该表达式(不是变量)得到一个引用类型。举个例子,假定p的类...原创 2020-04-24 11:24:19 · 451 阅读 · 1 评论 -
《C++ Primer》学习笔记(三):字符串、向量和数组
字符串、向量和数组命名空间的using声明标准库类型string命名空间的using声明using namespace::name头文件不应包含using声明:因为头文件的内容会拷贝到所有引用它的文件夹中去,如果头文件中有某个using声明,那么每个使用了该头文件的文件都会有这个声明,这样可能会不经意间包含了一些声明,发生始料未及的名字冲突。标准库类型string标准库类型 string...原创 2020-04-22 16:52:28 · 341 阅读 · 0 评论 -
《C++ Primer》学习笔记(二):变量和基本类型
《C++ Primer》学习笔记(二):变量和基本类型基本内置类型算数类型类型转换字面值常量变量变量声明和定义的关系变量命名规则作用域复合类型引用指针const限定符C++ 语言定义了几种基本类型:**字符型、整型、浮点型 **等;除此之外,还提供了可用于 自定义数据类型 的机制,标准库正是利用这些机制定义了许多更复杂的类型,比如 **可变长字符串 string、vector **等;最后,还能...原创 2020-04-19 12:29:10 · 520 阅读 · 0 评论 -
《C++ Primer》学习笔记(一):快速入门
《C++ Primer》学习笔记(一):快速入门初识输入输出控制流练习每个 C++ 程序必须含有 main 函数,且 main 函数是(唯一)被操作系统显式调用的函数。定义 main函数和定义其他函数一样。定义函数必须指定 4 个元素:返回类型、函数名、圆括号内的形参表(可能为空)和函数体。main 函数的返回值必须是 int 型。初识输入输出C++ 并没有直接定义任何输入或输出(IO)...原创 2020-04-17 12:06:55 · 443 阅读 · 0 评论 -
拷贝构造函数可以访问私有数据成员
class CExample{public: CExample(){pBuffer=NULL; nSize=0;} ~CExample(){delete pBuffer;} CExample(const CExample&); void Init(int n){ pBuffer=new char[n]; nSize=n;}private: char *pBuffer; ...转载 2019-06-16 09:37:24 · 2412 阅读 · 0 评论 -
正则表达式
RegExr 在线测试正则表达式表严肃讲正则表达式 完整的正则表达式由两种字符构成:特殊字符(special characters)称为”元字符”(meta characters),其它为”文字”(literal),或者是普通文本字符(normal text characters,如字母、数字、汉字、下划线)。正则表达式的元字符提供了更强大的描述能力。...原创 2019-07-24 10:12:04 · 297 阅读 · 0 评论 -
C++中的栈内存和堆内存的区别
数据结构中的堆与栈:栈:是一种连续储存的数据结构,具有先进后出的性质。通常的操作有入栈(圧栈)、出栈和栈顶元素。想要读取栈中的某个元素,就要将其之前的所有元素出栈才能完成。类比现实中的箱子一样。堆:是一种非连续的树形储存数据结构,每个节点有一个值,整棵树是经过排序的。特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。常用来实现优先队列,存取随意。内存中的栈区与堆区:一般说到...转载 2019-08-02 15:16:54 · 1186 阅读 · 0 评论 -
c++模板类(一)理解编译器的编译模板过程
如何组织编写模板程序前言常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”。看看我们几乎每天都能遇到的模板类吧,如STL, ATL, WTL, 以及Boost的模板类,都能体会到这样的滋味:接口简单,操作复杂。我在5年前开始使用模板,那时我看到了MFC的容器类。直到去年我还没有必要自己编写模板类。可是在我需要自己编写模板类时,我首先遇到的事实却...转载 2019-08-08 11:16:51 · 446 阅读 · 0 评论 -
C++设计模式5--单例模式Singleton--当前对象只有一个实例
转自:https://blog.csdn.net/gatieme/article/details/17998135很多情况下,我们在开发项目的过程中,都希望自己运行的某个部件只有一个实例,比如我们天天用QT开发界面,QTCreate里帮助菜单下的关于Qt Create菜单,弹出来的关于对话框,在QTCreate运行过程中,不论单击多少次,弹出的总是同一个对话框,这里的关于对话框就是一个单例...转载 2018-07-20 15:47:27 · 120 阅读 · 0 评论 -
C++ typedef typename 作用
C++ typedef typename 作用C++的一些语法让人看着费解,其中就有:typedef typename std::vector<T>::size_type size_type;详见《C++ Primer》(第五版)P584vector::size_type明白上述语法,首先要先看清vector::size_type的意思。参考《STL源码剖析》不难...原创 2019-05-30 20:53:58 · 329 阅读 · 0 评论 -
c++模板特化偏特化
模板为什么要特化,因为编译器认为,对于特定的类型,如果你对某一功能有更好地实现,那么就该听你的。模板分为类模板与函数模板,特化分为全特化与偏特化。全特化就是限定死模板实现的具体类型,偏特化就是模板如果有多个类型,那么就只限定为其中的一部分,其实特化细分为范围上的偏特化与个数上的偏特化。模板的泛化:是指用的时候指定类型。上面的方框内的内容是指模板的泛化,下面的方框内的内容是指模板...原创 2019-05-07 20:22:24 · 326 阅读 · 1 评论 -
unsigned/signed int/char类型表示的数值范围
一个32位的signed int类型整数表示的范围:-2^31~2^31-1一个32位的unsigned int类型整数表示的范围: 0~2^32-1一个8位的signed char类型整数表示的范围:-2^7~2^7-1一个8位的unsigned char类型整数表示的范围: 0~2^8-1示例:int main(){ char a[1000]; ...原创 2019-05-19 21:46:45 · 7343 阅读 · 0 评论 -
STL六大组件 功能与运用
STL提供六大组件,彼此可以组合套用:1. 容器(containers): 各种数据结构,如vector, list, deque, set, map 用来存放数据。从实现的角度来看,STL容器是一种class template。2. 算法(algorithms): 各种常用算法如sort, search, copy, erase... 从实现的角度来看,STL算法是一种function ...原创 2019-05-04 22:17:46 · 616 阅读 · 0 评论 -
C++输入相关
原创 2019-04-28 17:08:55 · 91 阅读 · 0 评论 -
C++ 严格弱序
什么是严格弱序?C++关联容器的有序容器对元素关键字的类型有要求,元素关键字的类型必须定义了严格弱序(stick weak ordering)拿内置类型来说,C++都定义了“<”操作符,这就是一个严格弱序,而“<=”就不是一个严格弱序严格弱序有什么用?对于内置类型我们自然可以有<、>、=来判断两个值的大小关系,而对于自定义的类类型,为它定义三种比较操作符是...转载 2019-05-03 10:58:43 · 524 阅读 · 0 评论 -
C++ queue 和 deque的区别
从使用的角度来讲主要差别就是:deque支持push_front、pop_front、push_back、pop_back。queue支持push_back、pop_front。----------------------------------------------------------------------------deque是双端队列#include<de...原创 2019-04-06 20:58:10 · 18001 阅读 · 3 评论 -
sstream用法
#include<sstream>stringstream对象用于输入一行字符串,以 空格 为分隔符把该行分隔开来 string str= "hello world I am very happy!"; stringstream sstream(str); ...原创 2019-08-18 21:24:52 · 27586 阅读 · 1 评论 -
C++使用thread类多线程编程
C++11中引入了一个用于多线程操作的thread类,简单多线程示例:#include <iostream>#include <thread>#include <Windows.h> using namespace std; void thread01(){ for (int i = 0; i < 5; i++) { cout ...转载 2019-08-07 11:17:55 · 582 阅读 · 0 评论 -
C++序列容器存储智能指针详解
通常用容器保存指针比保存对象更好,而且大多数时候,保存智能指针比原生指针好。下面是一些原因:在容器中保存指针需要复制指针而不是它所指向的对象。复制指针通常比复制对象快。在容器中保存指针可以得到多态性。存放元素基类指针的容器也可以保存其派生类型的指针。当要处理有共同基类的任意对象序 列时,这种功能是非常有用的。应用这一特性的一个常见示例是展示一个含有直线、曲线和几何形状的对象序列。对指针容器...转载 2019-09-14 11:04:15 · 4286 阅读 · 0 评论 -
构造函数、析构函数、虚函数可否内联,有何意义
在语法上没有错误首先要掌握一点,构造函数、析构函数、虚函数可以声明为内联函数,这在语法上是正确的。如下面代码是正确的,因为inline同register一样,只是个建议,编译器并不一定真正的内联,在语法上是没有错误的:class A{public: inline A() {} inline ~A() {} inline virtual void virt...转载 2019-09-08 20:47:35 · 1642 阅读 · 2 评论 -
C++ STL中的vector的内存分配与释放
1.vector的内存增长vector其中一个特点:内存空间只会增长,不会减小,援引C++ Primer:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。设想一下,当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能难以接受。因此STL实现者在对vector进行内存分配时,其实际分配的容量要比...转载 2019-09-05 21:52:36 · 1259 阅读 · 0 评论 -
为什么复制构造函数的参数需要加const和引用
#include <iostream>using namespace std;class A{public: A(){ cout<<"default construct"<<endl; } ~A(){ cout<<"destructed"<<endl; } ...原创 2019-08-21 20:33:50 · 1626 阅读 · 0 评论 -
C++ 模板元编程的应用有哪些,意义是什么?
https://www.cnblogs.com/liangliangh/p/4219879.html为了谈应用,先谈谈使命。模板元编程的根在模板。模板的使命很简单:为自动代码生成提供方便。提高程序员生产率的一个非常有效的方法就是“代码复用”,而面向对象很重要的一个贡献就是通过内部紧耦合和外部松耦合将“思想”转化成一个一个容易复用的“概念”。但是面向对象提供的工具箱里面所包含的继承,组合与多态并...转载 2019-08-10 19:57:10 · 2047 阅读 · 0 评论 -
C++ 11 多线程--线程管理
说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段。并行是指两个或多个独立的操作同时进行。注意这里是同时进行,区别于并发,在一个时间段内执行多个操作。在单核时代,多个线程是并发的,在一个时间段内轮流执行;在多核时代,多个线程可以实现真正的并行,在多核上真正独立的并行执行。例如现在常见的4核4线程可以并行4个线程;4核8线程则使用了超线程技术,把一个物理核模拟为2个逻辑核心...转载 2019-08-07 15:57:00 · 182 阅读 · 0 评论 -
C++中typename关键字的使用方法和注意事项
1, 什么地方使用?用在模板定义里,标明其后的模板参数是类型参数。例如template<typename T, typename Y>T foo(const T& t, const Y& y){//....};templace<typename T>class CTest{private: T t;public: //...}...转载 2019-04-06 20:19:37 · 1502 阅读 · 0 评论