C++学习笔记
醉美遇见你倾城
菜鸟一只
展开
-
C++学习笔记1
习惯上,头文件根据其中定义的类的名字来命。char16_t表示16位的Unicode字符,char32_t表示32位的Unicode字符。类型unsigned int可以缩写位unsigned。当一个算术表达式中既有无符号数,又有int值时,int值会被转化为无符号数。无符号数运算后得到的结果一定是正数。u前缀表示char16_t类型的Unicode字符,U前缀表示char32_t类型的...原创 2019-02-28 23:15:39 · 362 阅读 · 0 评论 -
c++笔记-类型转换
类类型转换运算符是类的一种特殊成员函数,它负责将一个类类型的指转换成其他类型。类型转换函数的一般形式operator type() const;type表示某种类型。类型转换运算符可以面向任意类型(除void之外)进行定义,只要该类型能作为函数的返回类型。因此,我们不允许转换成数组或者函数类型,但允许转换成指针或者引用类型。#Note# 一个类型转换函数必须市类的成员函数;它不...原创 2019-03-14 21:31:34 · 262 阅读 · 0 评论 -
C++笔记-OOP
OOP即面向对象程序设计,核心思想是数据抽象,继承和动态绑定。通过使用数据抽象,可以实现类的接口与实现分离;使用继承,可以定义相似的类型并对其相似关系建模;使用动态绑定,可以在一定程度上忽略相似类型的区别。虚函数:在C++中,基类将类型相关的函数与派生类不做改变直接基础的函数区分对待。即,对于某些函数,基类希望它的派生类能够自己定义适合自己的版本,此时,基类就将这些函数声明成虚函数(virtu...原创 2019-03-14 21:32:36 · 175 阅读 · 0 评论 -
C++笔记-虚函数
对虚函数的调用可能在运行时才被解析。当某个虚函数通过指针或引用调用时,编译器产生的代码直到运行时才能确定该用哪个版本的函数。另一方面,对于非虚函数的调用在编译时进行绑定。通过对象进行的函数(虚函数或非虚函数)调用也在编译时绑定。如果虚函数使用默认实参,则基类和派生类中定义的默认实参最好一致。在某些情况下,我们希望执行某个特定版本的虚函数,需使用作用域运算符明确指出。含有(或者未经覆盖直接...原创 2019-03-14 21:33:14 · 325 阅读 · 0 评论 -
C++笔记-构造函数与拷贝控制
如果基类的析构函数不是虚函数,则delete一个指向派生类对象的基类指针将产生未定义的形为。class Quote{public: virtual ~Quote() = default; //动态绑定析构函数};Quote *itemp = new Quote; //静态类型与动态类型一致delete itemp; //调用Quote...原创 2019-03-14 21:34:26 · 211 阅读 · 0 评论 -
C++笔记-类模板
类模板是用来生成类的蓝图。与函数模板不同的是,编译器不能为类模板推断模板参数类型。因此必须在模板名后的尖括号中提供额外信息。例如,我们将实现StrBlob的模板版本,使之不限于string版本。我们命名为Blob。与使用标准库容器相似,使用Blob时,用户需要指出元素类型template <typename T>class Blob{public: typede...原创 2019-03-14 21:34:49 · 136 阅读 · 0 评论 -
C++笔记-成员模板
一个类(无论是普通类还是类模板)可以包含本身是模板的成员函数。这种函数称为成员模板。注意!成员模板不能是虚函数。普通(非模板)类的模板成员函数例子:我们定义一个普通类,将定义一个重载的函数调用运算符,接收一个指针,并对此指针指向delete 由于希望删除器能够使用于任何类型,因此定义为模板//函数对象类,对给定指针指向deleteclass DebugDelete{pu...原创 2019-03-14 21:35:15 · 1521 阅读 · 0 评论 -
C++笔记-模板与重载
函数模板可以被另一个模板或者一个普通非模板函数重载。在对重载的模板进行调用时,遵循以下顺序: 如果同样符合要求的函数中只有一个是非模板函数,则选择非模板函数 如果同样符合的函数中没有非模板函数,在多个函数模板中,某一个比其他模板更特例化,则选择此模板 否则,此调用有歧义关于特例化,例如:const string *sp = &s;cout <&l...原创 2019-03-14 21:35:42 · 238 阅读 · 0 评论 -
C++笔记-tuple元组
tuple是类似pair的模板,可以包含任意数量的成员。tuple<T1, T2, ..., Tn> t t是一个tuple,成员数为n,第i个成员的类型为Ti。所有成员都会进行值初始化。tuple<T1, T2, ..., Tn> t(v1, v2, ..., vn) t是一个tuple,同时第i个成员类型为Ti,使用vi进行初始化make_tup...原创 2019-03-14 21:36:04 · 147 阅读 · 0 评论 -
C++笔记-bitest类型
用于位运算的类,定义在头文件bitset中。能够处理超过最长整型类型的位集合。定义和初始化bitset当定义一个bitset时,需要声明它包含多少个二进制位:bitset<32> bitvec(1U); //32位;低位为1,其他位为0bitset<n> b; //b有n位;每一位均为0.此构造函数位constexprbitset<n>...原创 2019-03-14 21:36:29 · 706 阅读 · 0 评论 -
C++笔记-正则表达式
正则表达式是一种描述字符序列的方法。这里先只介绍C++中的RE正则库RE库定义在头文件regex中,包含多个组件regex 表示有一个正则表达式类regex_match 将一个字符序列与一个正则表达式匹配regex_search 寻找第一个正则表达式匹配的子序列regex_replace 使用给定格式替换一个正则表达式sregex_iterator 迭...原创 2019-03-14 21:36:53 · 301 阅读 · 0 评论 -
C++笔记-随机数
随机数依赖于一个简单的rand函数来生成随机数。每个随机数的范围在0~32767之间。C++程序不应该使用库函数rand,而应该使用default_random_engine类和恰当的分布类对象。随机数引擎和分布引擎 类型,生成随机unsigned整数序列分布 类型,使用引擎返回服从特定概率分布的随机数可以通过调用引擎来生成一个原始随机数default_...原创 2019-04-13 22:07:38 · 157 阅读 · 0 评论 -
C++笔记-IO库再探
标准库定义了一组操纵符,用来修改流的格式状态。一个操纵符是一个函数或者对象,会影响流的状态,并能用作输入或输出运算符的运算对象。例如:endl 在使用endl时,就像是将它写到流中去。但是endl实际上是一个操作: 它输出一个换行,并刷新缓冲区。当操纵符改变流的状态时,会影响该流的后续操作例如: cout << "default bool value...原创 2019-04-13 22:07:23 · 137 阅读 · 0 评论 -
排序
冒泡排序的些许改进void BubbleSort(int arr[], int length){ int flag = 0; for(int i = 0;i<length && flag == 0;i++) { flag = 1; for(int j = i;j < length;j++) ...原创 2019-04-08 10:09:01 · 88 阅读 · 0 评论 -
STL进阶-1
函数模板不允许自动类型转化,普通函数则可以进行自动类型转化。即,当模板函数严格类型匹配不上时,同名的普通函数则可以对参数可能的进行类型转换。C++文件的执行过程,由原始cpp文件输入,经过预编译器,对头文件和宏定义进行展开,生成.i文件;再经过编译器,生成汇编文件.o类型;而后经过汇编器,生成二进制.o文件;最后经过链接器生成可执行文件.exe。//在Linux下,分别使用带参数的g++命...原创 2019-04-03 08:50:28 · 159 阅读 · 0 评论 -
STL进阶-2
对于调用拷贝构造=号操作符需要满足:1) 对象元素必须能够被拷贝<即=号有被重载> 2)容器中的元素都是值语义,而非引用语义,向容器中放入元素,都是拷贝一份放进去 3) 如果元素的成员有指针,注意深拷贝和浅拷贝<深拷贝:不光拷贝指针,将指针指向的对象也拷贝一份;浅拷贝:仅拷贝指针>异常机制:1. 函数的返回值可能被忽略,但是异常不会被忽略,即如果程序出现异常但是没有...原创 2019-04-03 08:51:05 · 146 阅读 · 0 评论 -
STL进阶-3
标准输入输出流:cin,cout,cerr,clog。其中cerr没有缓冲区。int a;cin >> a;//此时,cin流会从缓冲区中拿数据,若缓冲区没有,则等待键盘输入EOF结束符在键盘上为Ctrl+Z文件流操作,写入时增加app属性表示不覆盖之前内容,追加在末尾windows下文件以回车+换行作为一行结束标志,而在linux下只使用换行作为结束标志,在wi...原创 2019-04-03 08:51:56 · 100 阅读 · 0 评论 -
STL进阶-4
STL:标准模板库。以模板的形式实现。广义上分为容器,算法,迭代器。容器和算法直接通过迭代器无缝连接。在C++标准中,STL被组织为以下13个头文件:<algorithm>,<deque>,<functional>,<iterator>,<vector>,<list>,<map>,<memory>...原创 2019-04-03 08:52:24 · 133 阅读 · 0 评论 -
c++笔记-函数重载
当一个运算符函数是成员函数,那么他的第一个(左侧)运算对象绑定到隐式的this指针上。因此,成员运算符函数的(显式)参数数量比运算符的运算对象总数少一个。对一个重载运算符来说,其优先级和结合律与其对于的内置运算符保持一致。重载并不能改变其优先级。不能重载的运算符有: :: 运算符 .* 运算符 ?: 运算符 . 运算符在对输出运算符进行重载时,应该主要负责打印对象的内容,而...原创 2019-03-03 22:34:51 · 105 阅读 · 0 评论 -
c++笔记-内存管理对象移动
新标准最主要的特性是可以移动而非拷贝对象的能力。避免了由于移动对象较大而拷贝代价过大的缺点。标准库容器、string和shared_ptr类既支持移动也支持拷贝。IO类和unique_ptr类可以移动但不能拷贝。右值引用。为了支持移动操作而引入的新的引用类型。通过&&来获得右值引用,而不是(&)取址符。一般而言,一个左值表达式是一个对象身份,而一个右值表达式是对象的值。...原创 2019-03-03 22:34:26 · 432 阅读 · 0 评论 -
C++学习笔记2
类一般都不定义在函数体中,为了确保各个文件中类的定义一致,类通常被定义在头文件中,而且类所在头文件的名字应该与类的名字一样头文件中通常包含哪些只能被定义一次的实体,如类,const和constexpr等。有时候头文件中也可能用到其他头文件。有必要在书写头文件时做适当处理,使得遇到多次包含的时候也能安全和正常的工作C++中偶尔会用到一项功能,头文件保护符,头文件保护符依赖于预处理变量#if...原创 2019-02-28 23:17:04 · 216 阅读 · 0 评论 -
C++学习笔记3
switch执行过程中,如果要为某个case分支定义并初始化一个变量,我们应该将该变量定义在块内,从而确保后面的所有case标签都在变量的作用域之外case A: { 定义并初始化变量; } break;case B: //无法访问case A中定义的变量异常处理:throw表达式与try/catch。throw后紧跟抛出异常的类型,t...原创 2019-02-28 23:17:49 · 82 阅读 · 0 评论 -
C++学习笔记4
我们在定义类的时候,常常需要定义一些辅助函数,比如add、read和print等。尽管这些函数的定义的操作从概念上来说属于类的接口的组成部分,但他们实际上并不属于类的本身。称作非成员函数。构造函数,每个类都分别定义了它的对象被初始化的方式,类通过一个或几个特殊的成员函数来控制其初始化过程。任务时初始化类对象的数据成员,无论合适只要类的对象被创建,就会执行构造函数。构造函数的名字与类名相同。但...原创 2019-02-28 23:18:32 · 114 阅读 · 0 评论 -
c++笔记-类的其他特性
为了展示特性,需要定义一对相互关联的类,分别是Screen和Window_mgrclass Screen {public: typedef std::string::size_type pos; //或者使用using pos = std::string::size_type;private: pos cursor = 0; pos height = 0...原创 2019-02-28 23:19:07 · 125 阅读 · 0 评论 -
C++笔记-类的其他特性2
类之间的友元关系。友元函数是在类中声明,在类外定义函数体,可以令友元函数访问类的私有成员变量。如果一个类中的成员函数,需要访问另一个类的私有成员,于是要建立友元关系。class Screen{ //Window_mgr的成员可以访问Screen类的私有部分 friend class Window_mgr;};//如果一个类指定了友元类,则友元类的成员函数可以访问该类的所...原创 2019-02-28 23:19:56 · 129 阅读 · 0 评论 -
c++笔记-类的其他特性3
如果有些成员需要与类本身关联,而不是与类的各个对象保持关联,可以定义为类的静态成员。使用关键字static声明,静态成员可以时public或者private,成员类型可以是常量、引用、指针、类类型等。class Account{public: void calculate() { amount += amount * interestRate; }...原创 2019-02-28 23:20:37 · 70 阅读 · 0 评论 -
c++笔记-IO库
c++语言不直接处理输入输出,而是通过一组定义在标准库中的类型来处理IO。头文件内容iostream.h读写流控制fstream.h文件读写流控制sstream.hstring流读写控制为了支持宽字符,标准库定义了一组类型和对象来操作wchar_t类型的数据。宽字符版本的类型和函数的名字以w开头。例如,wcin,wcout,wcerr对应cin,...原创 2019-02-28 23:21:14 · 222 阅读 · 0 评论 -
c++笔记-顺序容器
标准库中提供了一些顺序容器。我们在选择不同的容器时,应考虑:向容器中添加或删除元素的代价;非顺序查找元素的代价。容器名称性能vector可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢deque双端队列,支持快速访问。在头尾插入/删除速度很快list双向链表,只支持双向顺序访问。在list中任何位置插入或者删除操作都很快for...原创 2019-02-28 23:21:45 · 118 阅读 · 0 评论 -
c++笔记-泛型算法
大多数算法功能都定义在头文件algorithm中。标准库还在头文件numeric中定义了一组数值泛型算法泛型算法不会进行容器操作,只会运行在迭代器之上。一些算法从两个序列中读取元素,构成这两个序列的元素可以来自于不同的容器注意!用一个单一迭代器表示第二个序列的算法都假定第二个序列至少于第一个序列一样长(或比它长),确保算法不会试图访问第二个序列中不存在的元素是程序员的责任。例如,equal比...原创 2019-02-28 23:22:20 · 123 阅读 · 0 评论 -
c++笔记-迭代器深入
除了为每个容器定义迭代器外,标准库在头文件iterator中还定义了额外几种迭代器插入迭代器(insert iterator):这些迭代器被绑定到一个容器上,可以用来向容器插入元素。流迭代器(stream iterator):绑定到输入或输出流上,可以用来遍历关联的IO流反向迭代器(reverse iterator):这些迭代器向后而不是向前移动,除了forward_list外都有反向迭...原创 2019-03-03 22:30:46 · 211 阅读 · 0 评论 -
c++笔记-关联容器
关联容器支持高效的关键词查找和访问。两个主要的关联容器类型是map和set。map中的元素是一些关键字-值对,即键值对set支持搞笑的关键字查询操作,即检查一个给定的关键字是否在set中。类型map和multimap定义头文件map中,类型set和multiset定义在头文件set中。无序容器则定义在unordered_map和unordered_set中按关键字有序保存元素map...原创 2019-03-03 22:31:20 · 111 阅读 · 0 评论 -
c++笔记-动态内存(new)
相对于智能指针来说,运算符new和delete的直接管理内存使用不当会容易出错。使用new来动态分配和初始化对象//由于在自由空间分配到的内存是无名的,因此new无法为其分配的空间命名//而是返回一个指向该对象的指针int *pi = new int; //pi指向一个动态分配的、未初始化的无名int类型对象//可以采用直接初始化int *pi = new int(1024); ...原创 2019-03-03 22:31:43 · 199 阅读 · 0 评论 -
c++笔记-动态内存(unique_ptr & weak_ptr)
定义在unique_ptr上的独有操作unique_ptr<T> u1 空unique_ptr,可以指向类型为T的对象。u1会使用delete来释放它的指针unique_ptr<T, D> u2 u2会使用一个类型为D的可调用对象来释放它的指针unique_ptr<T, D> u(d) 空unique_ptr,指向类型为T的对...原创 2019-03-03 22:32:12 · 234 阅读 · 0 评论 -
c++笔记-动态内存(shared_ptr)
静态内存用来保存局部static对象、类static数据成员以及定义在任何函数之外的变量。由编译器自动创建和销毁。栈内存用来保存定义在函数内的非static对象。对于程序块运行时才存在;static在使用之前分配,程序结束时销毁。除了静态内存和栈内存,每个程序还有一个内存池。称作heap(堆内存)。程序用堆来存储动态分配的对象–即哪些在程序运行时分配的对象。这些动态对象的生存周期由程序来控制...原创 2019-03-03 22:32:35 · 933 阅读 · 0 评论 -
c++笔记-类类型拷贝控制
一个类通过定义五种特殊的成员函数来控制对象的拷贝,移动,赋值和销毁操作,分别是拷贝构造函数、拷贝赋值构造函数、移动构造函数、移动赋值运算符和析构函数。拷贝和移动构造函数定义了当同类型的另一个对象初始化本对象时,做什么操作拷贝和移动赋值运算符定义了一个对象赋值给同类型的另一个对象时,做什么操作析构函数定义了对象销毁时,做什么操作拷贝构造函数:如果一个构造函数的第一个参数时自身类型的引...原创 2019-03-03 22:33:03 · 284 阅读 · 0 评论 -
c++笔记-动态数组(new & allocator)
new和deleta都是一次分配/释放一个对象,对于vector和string来所,在分配内存时,必须一次性为很多个元素分配内存。大多数应用应该使用标准库容器而不是动态分配的数组。使用容器更为简单、更不容易出现内存管理错误并且有可能有更好的性能。我们所分配的动态数组,并不是得到数组对象,而是得到指向数组类型的指针。int *pia = new int[10];int *pia2 = ne...原创 2019-03-03 22:33:29 · 360 阅读 · 0 评论 -
c++笔记-动态内存管理类
有些类在运行时分配可变大小的内存空间,它们通常可以使用标准库的容器来保存。但是,这一策略并不是对每个类都使用,有些类需要自己对内存进行分配。因此这些类一般通过定义自己的拷贝构造函数来管理分配的内存。我们使用一个allocator来获得原始内存。由于allocator分配到的内存是未构造的,我们将在需要添加新元素时,用allocator的construct成员在原始内存中创建对象。当需要删除...原创 2019-03-03 22:34:03 · 455 阅读 · 0 评论 -
STL进阶-5
容器的深拷贝和浅拷贝问题STL容器所提供的都是值(Value)寓意,而非引用(reference)寓意,也就是说我们给容器中插入元素的时候,容器内部实施了拷贝动作,将我们要插入的元素再拷贝一份放入到容器中,而不是将原数据直接放到容器中,也就是说,我们提供的元素必须能够被拷贝。因此,对于编写的类对象来说,如果类中含有指针对象时,应当在类中提供拷贝构造函数否则,在原对象被析构后,容器中对象...原创 2019-04-03 08:53:00 · 263 阅读 · 2 评论