C++
影景彡
这个作者很懒,什么都没留下…
展开
-
effective C++笔记--杂项讨论
文章目录不要轻忽编译器的警告让自己熟悉包括TR1在内的标准程序库不要轻忽编译器的警告. (ps:这条条款真是最容易理解的条款了) 严肃对待编译器发出的警告信息,努力在编译器的最高警告级别下争取“无任何警告”的荣誉。 不要过度依赖编译器的报警能力,因为不同的编译器对待不同的事情的态度可能是不同的,一旦程序移植到另一个编译器上,原本依赖的警告信息可能失效。让自己熟悉包括TR1在内的标准程...原创 2018-12-10 15:21:52 · 223 阅读 · 1 评论 -
C++ Primer第五版笔记--枚举类型
枚举类型可以将一组整型常量组织在一起;和类一样,每个枚举类型定义了一种新的类型;枚举属于字面常量类型。 C++包含两种枚举:限定作用域(C++11新标准引入)的和不限定作用域的: 定义限定作用域的枚举类型的一般形式是:首先是关键字enum class(或者等价的使用struct),之后是枚举类型名字以及用花括号括起来的以逗号分割开来的枚举成员列表,最后是一个分号: enum clas...原创 2018-10-12 14:23:37 · 695 阅读 · 0 评论 -
C++ Primer第五版笔记——多重继承与虚继承
多重继承在派生类的派生列表中可以包含多个基类,以逗号分隔:class Panda : public Bear,public Endangered和单继承一样,多重继承的派生列表也只能包含已经被定义过的类,而且这些类不能是final(类被final修饰,不能被继承)的。派生类构造函数初始化所有基类 构造一个派生类对象的同时构造并初始化它的所有基类子对象,还是以逗号来分隔://显示的初...原创 2018-09-18 14:51:28 · 636 阅读 · 0 评论 -
C++ Primer第五版笔记————函数模板显式实参
在某些情况下,编译器无法推断模板实参的类型,或者希望允许用户控制模板实例化。当函数返回类型与参数列表中的类型都不相同时,这两种情况最常出现。 指定显式实参template <typename T1,typename T2,typename T3>T1 sum(T2,T3);如上所示,没有任何函数实参的类型可以推断出T1的类型,因此,每次调用函数时都需要为T1提供一个显式...原创 2018-09-07 10:42:46 · 268 阅读 · 0 评论 -
C++ Primer第五版笔记————模板实参推断
控制实例化: 当模板被使用时才实例化这一特性使得相同的实例可能出现在多个对象文件中,比如当两个或多个独立编译的源文件使用了相同的模板,并提供了相同的模板参数时,每个文件中就都会有一个该模板的实例。 在大系统中,在多个文件中实例化相同模板的额外开销会很严重,在新标准下,可以通过显示实例化来避免这种开销。显示实例化的形式如下:extern template class Blob&lt;stri...原创 2018-09-07 09:46:40 · 159 阅读 · 0 评论 -
C++ Primer第五版笔记——bitset类型
标准库定义了bitset类,使得位运算的使用更为容易,并且能够处理超过最长整型类型大小的位集合,其定义在头文件bitset中。 定义和初始化 bitset是一个类模板,类似于array类,具有固定的大小,当定义一个bitset时,需要声明它包含多少个二进制位:bitset<32> bt(1U); //32位;低位为1,其他位为0bitset中的二进制位也是不命...原创 2018-09-10 11:47:56 · 175 阅读 · 0 评论 -
C++ Primer第五版笔记——tuple类型
tuple是类似pair的模板。每个pair的成员类型都不相同,但每个pair都有两个成员。tuple类型的成员类型也都不相同,但一个tuple可以有任意数量的元素。每个确定的tuple类型的成员数目是固定的,但是两个tuple类型的成员数目可以不同。 tuple可以用在将一些数据组合成单一对象,但又不想麻烦的定义一个新数据结构来表示这些数据时。可以将它看做是一个“快速而随意”的数据结构。 ...原创 2018-09-10 10:45:13 · 190 阅读 · 0 评论 -
C++ Primer第五版笔记——特殊的IO库特性(二)
流随机访问各种流类型通常都支持对流中数据的随机访问。可以重定位流,使之跳过一些数据。标准库中提供了一对函数,来定位(seek)到流中的特定位置,以及告诉(tell)当前位置。 seek和tell是否会做有意义的事依赖于流绑定到哪个设备。在大多数的系统中,绑定到cin、cout、cerr和clog的流不支持随机访问。对这些流虽然可以调用seek和tell,但是运行时会报错。seek和tel...原创 2018-09-18 10:36:25 · 80 阅读 · 0 评论 -
C++ Primer第五版笔记——特殊的IO库特性(一)
格式化输入与输出除了条件状态外,每个iostream对象还维护一个格式状态来控制IO如何格式化的细节,比如控制整数的进制、浮点数的精度、输出宽度等。 标准库定义了一组操纵符来改变流的格式状态,一个常用的操纵符:endl,一般将它“写”到输出流,就像它是一个值一样,但它不是一个普通值,而是一个操作:它输出一个换行符并刷新缓冲区。很多操纵符改变格式状态 操作符用于两大类输出控制:控制数值的...原创 2018-09-17 09:50:16 · 118 阅读 · 0 评论 -
C++ Primer第五版笔记——模板参数与成员模板
模板参数 类似函数参数的名字,一个模板参数的名字也没有什么内在含义,通常将类型参数命名为T,但是实际上可以是任何名字。 模板参数与作用域: 模板参数遵循普通的作用域规则。一个模板参数的可用范围是在其声明后,至模板声明或定义结束之前。与其他名字一样,模板参数会隐藏外层作用域中声明的相同的名字。但是不同的是,在模板内不能重用模板参数名:typedef double A;template...原创 2018-09-05 10:19:17 · 1759 阅读 · 0 评论 -
C++ Primer第五版笔记——随机数
新标准前,C和C++都依赖与一个简单的C库函数rand来生成随机数。此函数生成均匀分布的伪随机整数,每个随机数在0和一个系统相关的最大值之间。rand函数有一些问题:有许多程序需要不同范围的随机数;一些应用需要随机生成浮点数;一些程序需要非均匀分布的数。 定义在头文件random中的随机数库通过一组协作的类来解决这些问题:随机数引擎类和随机数分步类。随机数引擎和分布 随机数引擎类是函数对象...原创 2018-09-11 14:18:25 · 394 阅读 · 0 评论 -
C++ Primer第五版笔记——类模板
类模板是用来生成类的蓝图,与函数模板不同的是,编译器不能为类模板推断模板参数类型,所以为了使用类模板,需要在模板名后的尖括号中提供额外的信息。定义类模板 类似函数模板,类模板以关键字template开始,后跟模板参数列表。在类模板(及其成员)的定义中,将模板参数当做替身,代替使用模板时用户需要提供的类型和值。//实现一个类,用处是存放某种类型的元素,如string等template...原创 2018-09-04 11:33:57 · 225 阅读 · 0 评论 -
C++ Primer第五版笔记——定义模板
函数模板: 类似两个数之间进行比较的功能,可能会发生在整数或小数上,可以通过定义一个通用的函数模板,而不用每个类型定义一个新函数。一个函数模板就是一个公式,可用来生成针对特定类型的版本:template &lt;typename T&gt;int compare(const T&amp; v1,const T&amp; v2 ){ if(v1 &gt; v2) return -1;...原创 2018-08-31 16:10:33 · 151 阅读 · 0 评论 -
C++ Primer第五版笔记——重载new和delete
重载new和delete要想掌握重载new和delete的方法,首先要对new和delete表达式的工作机理有更多了解,当执行一条new/delete表达式时:string* sp = new string("hello");string* arr = new string[10];delete sp;delete[] arr;对new来说实际执行了三个步骤:第一步、new表达式调...原创 2018-10-08 11:27:39 · 263 阅读 · 0 评论 -
C++ Primer第五版笔记——运行时类型识别
运行时类型识别(run-time type identification,RTTI)的功能由两个运算符实现: typeid运算符,用于返回表达式的类型。 dynamic_cast运算符,用于将基类的指针或引用安全的转换成派生类的指针或引用。 当这两个运算符用于某种类型的指针或引用,并且该类型含有虚函数时,运算符将使用指针或引用所绑定的对象的动态类型。 这两个运算符适用于以下情况:使用基类对...原创 2018-10-09 09:47:53 · 138 阅读 · 0 评论 -
effective C++笔记--定制new和delete(二)
文章目录编写new和delete时需固守常规写了placement new也要写 placement delete编写new和delete时需固守常规. 在编写自己的operator new和operator delete时,需要遵守一些规则,先从operator new开始:实现一致性的operator new必需要返回正确的值;内存不足时必须调用new-handler函数;必须有应对零内存...原创 2018-12-07 14:50:09 · 92 阅读 · 0 评论 -
effective C++笔记--定制new和delete(一)
文章目录了解new-handler的行为. C++允许手动的管理内存,这是双刃剑,你可以使程序更有效率,也可能面临维护程序带来的麻烦,所以了解C++内存管理的例程很是重要,其中的两个主角是分配例程和归还例程(也就是operator new 和 operator delete),配角是new-handler,这是当operator new无法满足客户的内存需求时调用的函数。 额外有一点要注意的...原创 2018-12-07 10:43:19 · 187 阅读 · 0 评论 -
effective C++笔记--模板与泛型编程(三)
文章目录请使用traits classes表现类型信息认识template元编程请使用traits classes表现类型信息. traits并不是C++的关键字或是预先定义好的构件,它们是一种技术,也是一个C++程序员共同遵守的协议。这项技术的要求之一是:它对内置类型和用户自定义类型的表现必须一样好,即traits技术能够施行于用户自定义类型,也能施行于内置类型如指针身上。 “trait...原创 2018-12-01 15:34:39 · 219 阅读 · 0 评论 -
effective C++笔记--模板与泛型编程(二)
文章目录运用成员函数模板接受所有兼容类型需要类型转换时请为模板定义非成员函数运用成员函数模板接受所有兼容类型. 真实指针做的很好的一件事是支持隐式转换,派生类的指针可以指向基类的指针,指向非常量对象的指针可以指向转换成常量对象的指针等。但是如果想在用户自定义的智能指针中模拟上述转换,稍稍会有点麻烦。例如:class Top{...};class Middle:public Top{...}...原创 2018-11-30 15:09:08 · 131 阅读 · 1 评论 -
effective C++笔记--模板与泛型编程(一)
文章目录了解隐式接口和编译器多态了解typename的双重意义了解隐式接口和编译器多态. 面向对象编程世界总是以显式接口和运行期多态解决问题。比如一个函数中有一个参数是一个类的指针或引用,由于该参数的类型确定,所以它必定支持这一类的接口,可以在源码中找到相关的接口(比如头文件中),我们称此为一个显示接口;假如这个类的某些成员函数时virtual的,那么该参数的调用将显现出运行期多态,也就是根据...原创 2018-11-26 16:41:15 · 176 阅读 · 0 评论 -
effective C++笔记——实现
文章目录尽可能延后变量定义式的出现时间尽量少做转型操作避免返回handles指向对象的内部成分为“异常安全”而努力是值得的尽可能延后变量定义式的出现时间. 当定义了一个变量并且它的类型存在构造函数和析构函数,那么程序需要承受它的构造成本和析构成本,即使这个变量并不被使用,仍需要耗费这些成本,所以应该尽量避免这种情况的发生。 通常我们不会定义一个不被使用的变量出来,但是定义变量过早可能会应为...原创 2018-11-20 11:50:29 · 241 阅读 · 0 评论 -
effective C++笔记--继承与面向对象设计(二)
文章目录绝不重新定义继承而来的非虚函数绝不重新定义继承而来的缺省参数值通过复合塑模出has-a或“根据某物实现出”明智而审慎地使用private继承绝不重新定义继承而来的非虚函数. 假设基类中有一个非虚的成员函数,那么派生类在公有继承基类的时候,会继承这个函数接口和它的实现,但是如果派生类中重新定义了这个函数接口,则会遮掩住基类的同名函数,这就不符合“public继承是一种is-a关系”了。所...原创 2018-11-22 14:41:23 · 112 阅读 · 0 评论 -
effective C++笔记--继承与面向对象设计(一)
文章目录确定你的public继承塑模is-a关系避免遮掩继承而来的名字区分接口继承和实现继承确定你的public继承塑模is-a关系. public继承在父类和子类之间的关系应该是:子类的对象也是一个父类的对象,但是父类的对象不是子类的对象,通俗点讲就是父类能派上用处的地方,子类也能派上用处,但是反过来就不是了。 假设有一个类表示鸟,它能派生出表示企鹅的类,鸟可以飞,所以在鸟这个类中有一个...原创 2018-11-21 16:43:07 · 164 阅读 · 0 评论 -
effective C++笔记——设计与声明
文章目录让接口容易被正确使用,不易被误用设计class犹如设计type宁以pass-by-reference-to-const替换pass-by-value必须返回对象是,别妄想返回其reference将成员变量声明为private宁以non-member、non-friend替换member函数若所有的参数皆需要类型转换,请为此采用non-member函数让接口容易被正确使用,不易被误用. ...原创 2018-11-05 12:45:29 · 104 阅读 · 0 评论 -
effective C++笔记——资源管理
文章目录以对象管理资源在资源类中小心copying行为在资源管理类中提供对原始资源的访问成对使用new和delete要使用相同型式以独立语句将newed对象置入指针资源需要在使用完之后就归还给系统,如果不这么做,糟糕的是就会发生。C++程序中常用的资源就是动态内存分配(使用完不归还会导致内存泄露),但是内存知识需要被管理的众多资源之一。其他常见的资源还包括文件描述器、互斥锁、图形界面中的字型和笔...原创 2018-11-01 15:24:30 · 152 阅读 · 0 评论 -
effective C++笔记——构造/析构/赋值运算
文章目录c++对类默认编写并调用的函数明确拒绝编译器自动生成函数为多态基类声明virtual析构函数别让异常逃离析构函数绝不在构造和析构过程中调用virtual函数令operator=返回一个引用(reference to *this)在operator=中处理“自我赋值”复制对象时勿忘其每一个成分c++对类默认编写并调用的函数当C++处理过一个类后,编译器会为它声明(编译器的版本)没有声明的...原创 2018-10-29 15:01:09 · 205 阅读 · 0 评论 -
effective C++笔记——尽量替换#define
宏替换的工作是由预处理器来做的,它不会被视为语言的一部分,因此可能发生的情况是: 定义了如下宏提换语句:#define RATIO 1.653 也许在编译器处理源码前这句话就被预处理器移走了,该记号名称可能没有进入记号表(symbol table)内。于是当运用此常量但获得一个编译错误时,该信息可能提到1.653而不是RATIO,这可能对调试产生很大的干扰。 解决之道是使用常量表达式来...原创 2018-10-26 11:35:26 · 369 阅读 · 1 评论 -
C++ Primer第五版笔记——构造函数与拷贝控制
虚析构函数: 继承关系对基类拷贝控制最直接的影响是基类通常应该定义一个虚析构函数,这样就能动态分配继承体系中的对象了。 当delete一个动态分配的对象的指针时将执行析构函数,如果该指针指向继承体系中的某个类型,则有可能出现指针的静态类型与被删除对象的动态类型不符的情况,例如:删除一个基类指针,而该指针实际指向的是子类的对象,那么编译器应该要知道在执行析构函数的时候是执行的子类的虚构函数。因此...原创 2018-08-23 15:11:36 · 531 阅读 · 0 评论 -
C++ Primer第五版笔记——虚函数
当我们使用基类的引用或指针调用一个虚成员函数时会发生动态绑定,知道运行时才会知道到底调用了哪个版本的虚函数,因此所有的虚函数都必须有定义。 对虚函数的调用可能在运行时才被解析 面向对象编程的核心思想是多态性(polymorphism)。多态性这个词源于希腊语,其含义是“多种形态”,引用或指针的静态类型与动态类型不同这一事实是C++语言支持多态性的根本所在。 当使用基类的引用或指针调用基类中定...原创 2018-08-17 10:47:19 · 453 阅读 · 0 评论 -
初识泛型算法
一、只读算法: 1.计算求和:accumulate 头文件:numeric 函数接受三个参数,前两个参数是需要求和的元素范围,第三个参数是和的初始值,示例如下://对于只读取不改变元素的算法,通常使用cbegin()和cend()int sum = accumulate(v.cbegin(),vec.cend(),0);表示求v中所有元素...转载 2018-06-26 14:29:46 · 165 阅读 · 0 评论 -
重排数列——C++方法
小易有一个长度为N的正整数数列A = {A[1], A[2], A[3]…, A[N]}。牛博士给小易出了一个难题:对数列A进行重新排列,使数列A满足所有的A[i] * A[i + 1](1 ≤ i ≤ N - 1)都是4的倍数。小易现在需要判断一个数列是否可以重排之后满足牛博士的要求。 输入描述:输入的第一行为数列的个数t(1 ≤ t ≤ 10),接下来每两行描述一个数列...原创 2018-03-23 11:41:28 · 1866 阅读 · 0 评论 -
C++标准输入输出流
对标准 输入输出流来说,在输入设备如键盘和程序之间会有一个输入缓冲区(一块内存空间),键盘的输入是输入到缓冲区中,程序从缓冲区中读取输入的数据,与之相同在程序和输出设备如显示器之间也有输出缓冲区,程序输出到输出缓冲区,输出设备再从输出缓冲区中读取数据。 几个有关的函数: 1.cin.get() 一次从缓冲区读取一个字符 2.cin.get(一个参数) 读一个字符 3.c原创 2017-12-25 11:00:33 · 235 阅读 · 0 评论 -
C++四种类型转换
1.static_cast: 用于内置的数据类型之间的转换,如int、char…; 还用于具有继承关系的指针或引用之间的转换 例子: int a = 97; char c = static_cast<char>(a);这样输出的c就是字符’a’.class A{};class B:public A{};class C;class D;A* a;C原创 2017-12-21 10:50:26 · 176 阅读 · 0 评论 -
C++const一些用法(二)
#includeusing namespace std;class Stu{public:int age;Stu(int age){this->age = age;}void fun1(){age = 4;}void fun2() const{ age = 8; //这句报错,加了const不允许修改其属性。}};原创 2017-07-11 14:49:52 · 152 阅读 · 0 评论 -
智能指针和万能指针
智能指针:智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类。除了能够在适当的时间自动删除指向的对象外,他们的工作机制很像C++的内置指针。智能指针在面对异常的时候格外有用,因为他们能够确保正确的销毁动态分配的对象。他们也可以用于跟踪被多用户共享的动态分配对象。智能指针的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个**计数器**与类指向转载 2017-09-05 09:12:37 · 593 阅读 · 0 评论 -
C/C++零碎知识点
总是看到很多零碎的知识点,想记下来又不知道该放在哪里,不记的话又不知道在哪里去找,尴尬。 PS:不要盲目相信答案哦。 知识太杂,以后有空再分类吧1.当派生类中不含对象成员时 · 在创建派生类对象时,构造函数的执行顺序是:基类的构造函数→派生类的构造函数; · 在撤消派生类对象时,析构函数的执行顺序是:派生类的构造函数→基类的构造函数。 当派生类中含有对象成员时 · 在定义派生类对象原创 2017-10-31 11:57:09 · 274 阅读 · 0 评论 -
结构体和类
在C语言中结构体是不能继承的,另外C语言中的结构体中不能有成员函数,可以通过函数指针的方式来指向外部的函数。但是在C++中也有结构体的概念,此时结构体是可以继承的,只不过结构体继承的默认访问权限为public,类继承的默认访问权限为private,C++中的结构体是可以有成员函数的。 当然C++中结构体的成员变量访问权限也有三种:pubic、protected、private,默认访问权限是pub转载 2017-10-31 12:06:54 · 208 阅读 · 0 评论 -
Static修饰的函数和变量
静态函数: 1.如果static int func(….)不是出现在类中,则它不是一个静态成员函数,只是一个普通的全局函数,只不过由于 static 的限制,它只能在文件所在的编译单位内使用,不能在其它编译单位内使用。 2.static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。因此static避免了调用函数时压栈出栈,速度快很多。转载 2017-09-03 17:15:11 · 590 阅读 · 0 评论 -
函数对象简单使用
/*求个阶乘*/#include<iostream>#include<numeric> //包含数值算法的头文件 1、2 #include<functional> //包含标准函数对象头对象(利用普通函数来定义函数对象,利用类来定义函数对象可以不用包含) 3using namespace std;原创 2017-07-13 10:03:51 · 255 阅读 · 0 评论 -
两种数组传值方法
#includeusing namespace std;template //void sort(T*);void sort(T&);int main(){int a[20] = {1,3,5,7,9,11,13,15,17,19,2,4,6,8,10,12,14,16,18,20};sort(a);coutfor(int i = 0;i原创 2017-07-12 14:19:23 · 3898 阅读 · 0 评论