
C++进阶
文章平均质量分 90
coolwriter
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
c++类型转换static_cast, dynamic_cast, reinterpret_cast, const_cast区别比较,显示转换,隐式转换
1.实现隐式类类型转换short a=2000;int b;b=a;short是两字节,int是四字节,由short型转成int型是宽化转换(bit位数增多),编译器没有warning,如下图所示。宽化转换(如char到int,int到long long,int到float,float到double,int到double等)构成隐式转换,编译器允许直接转换。 但若doub...原创 2018-03-27 10:30:22 · 294 阅读 · 0 评论 -
变量使用的注意事项
1. 在声明变量的时候就应该初始化这告诉我们应该把int count换成int count = 0,把short *pointer换成short *pointer = 0。有些语言,比如VB不支持声明的时候就初始化,那就在变量声明的下一句就给赶紧给它赋个值吧!当变量是对象时,则要确保这个对象被合理地初始化了,在类中要定义构造函数(最好有个默认的构造函数)。2. 能使用const的地方,...转载 2018-03-27 10:43:04 · 1558 阅读 · 0 评论 -
Effective C++ (条款1到3)
条款一:将C++视为一个语言联邦C++起源于C,最初的名称为C with Classes,意为带类的C语言,然而,随着C++的不断发展和壮大,在很多功能上已经远远超越了C,甚至一些C++程序员反过来看C代码会觉得不习惯。C++可以看成由四个部分组成,分别是: (1) C。C++从语法和代码风格上以C为基础,这也正是C++命名的由来,是在C的基础上++。有意思的是,在《C++ Primer...原创 2018-03-27 10:59:16 · 491 阅读 · 0 评论 -
Effective C++ (条款4到6)
条款四:确定对象被使用前已先被初始化1. 内置类型C++中的内置基本类型,比如int,double,float等,初值都是垃圾值,即声明int i,i的初值是一个垃圾值。本书建议的最佳处理方法是:永远在使用对象之前将之初始化。比如: int x = 0; const char* test = “hello world”; double d; cin >> d;...原创 2018-03-27 11:30:22 · 437 阅读 · 0 评论 -
Effective C++(条款7到9)
条款七:为多态基类声明virtual析构函数严格来说,多态分为编译时多态和运行时多态,编译时多态是函数的重载,而运行时多态则是迟绑定技术,即根据基类指针或引用的实际指向来决定采取何种行动,一般来说,多态特指运行时多态。下面我们来举有关C++多态的一个简单例子class Shape{private: int color;public: virtu...原创 2018-03-27 11:41:45 · 468 阅读 · 2 评论 -
EffectiveC++条款10到12
条款十:令operator=返回一个reference to *this这个条款很简单的说,先解释一下为什么赋值后还要有返回值,这是因为我们可以这样用连等:int x, y, z; x = y = z;注意等号是右结合的,所以上述运算实际上等同于:x = (y = z);如果没有返回值,上述代码就不能通过编译。至于为什么返回的是一个引用,这并不是编译器强制的,但有...原创 2018-03-27 22:42:53 · 250 阅读 · 0 评论 -
Effective C++条款13、14
条款十三:以对象管理资源从这个条款开始,就进入到资源管理部分了。资源管理往往是大型项目的一个难点,也是重中之重,看到一些编程规范,都是将资源管理的规范列为高优先级的重点。管理资源的最好方法其实是预防,而好的预防方法就是尽量不去使用C/C++的原生指针,这些指针像幽灵一样,一个“忘记”,就是一个隐患。当项目小的时候,这些隐患看不出来,但当研发一个拥有上万级用户的产品时,服务器对很多人同时运行...原创 2018-03-27 22:59:47 · 368 阅读 · 0 评论 -
Effective C++条款15、16、17
条款十五:在资源类管理类中提供对原始资源的访问 get()这个MySharedPtr已经可以进行资源管理了,当资源的生命周期结束后,可以自动将之删除。但对于使用者来说,还是会遇到一些问题,比如:void PrintIntPointerValue(int* p){ cout << *p << endl;}int main(){ MyShare...原创 2018-03-28 11:07:33 · 326 阅读 · 0 评论 -
Effective C++条款18、19、20
条款十八:让接口容易被正确使用,不易被误用从本条款开始,就进入到全书的第四部分:设计与声明。程序员设计接口时应本的对用户负责的态度,“如果客户企图使用某个接口而却没有获得他所预期的行为,这个代码不应该通过编译;如果代码通过了编译,那它的作为就该是客户所想要的”。举一个书上的例子: class Date { public: Date(int month, int day...原创 2018-03-28 11:35:37 · 404 阅读 · 0 评论 -
Effective C++条款21、22、23
条款二十一:当必须返回对象时,别妄想返回其reference当你理解条款20后,很可能出现一种过度使用的情况:只要看到是一个非内置类型,就去使用引用传值。举个书上的例子:class Rational{private: int numerator; int denominator;public: Rational():numerator(0), denomi...原创 2018-03-28 11:54:01 · 767 阅读 · 0 评论 -
Effective C++条款23
条款二十三:宁以non-member、non-friend替换member函数本条款还是讨论封装的问题,举书上的例子:class WebBrower{public: void ClearCach(); void ClearHistory(); void RemoveCookies();};定义了一个WebBrower的类,里面执行对浏览器的清理工作,包...原创 2018-03-28 12:58:10 · 512 阅读 · 0 评论 -
Effective C++条款25、26、27
条款二十五: 考虑写出一个不抛出异常的swap函数我也不知道为什么作者给这个条款起这样的名字,因为这样看上去重点是在“不抛出异常”,但事实上作者只是在全文最后一段说了一下不抛异常的原因,大部分段落是在介绍怎样写一个节省资源的swap函数。你可以试一下,只要包含了头文件iostream,就可以使用swap函数,比如:#include <iostream>int mai...原创 2018-03-28 15:56:45 · 367 阅读 · 1 评论 -
Effective C++条款28、29、30
条款二十八:避免返回handlers指向对象内部成分class Student{private: int ID; string name;public: string& GetName() { return name; }};这是一个学生的类,类里面有两个成员变量,一个是学生ID,用整数表示,另一个是姓名,用str...原创 2018-03-28 16:37:41 · 645 阅读 · 0 评论 -
Effective C++条款31、32、33
条款三十一:将文件间的编译依存关系降至最低(第一部分)在说这一条款之前,先要了解一下C/C++的编译知识,假设有三个类ComplexClass, SimpleClass1和SimpleClass2,采用头文件将类的声明与类的实现分开,这样共对应于6个文件,分别是ComplexClass.h,ComplexClass.cpp,SimpleClass1.h,SimpleClass1.cpp,Sim...原创 2018-03-28 17:21:38 · 332 阅读 · 0 评论 -
Effective C++ 条款32、33
条款三十二:确定你的public继承继承塑模出is-a关系这一条款是说的是公有继承的逻辑,如果使用继承,而且继承是公有继承的话,一定要确保子类是一种父类(is-a关系)。这种逻辑可能与生活中的常理不相符,比如企鹅是生蛋的,所有企鹅是鸟类的一种,直观来看,我们可以用公有继承描述:class Bird{public: virtual void fly(){cout <&l...原创 2018-03-28 22:52:34 · 380 阅读 · 0 评论 -
Effective C++ 条款34
条款三十四:区分接口继承和实现继承这个条款书上内容说的篇幅比较多,但其实思想并不复杂。只要能理解三句话即可,第一句话是:纯虚函数只继承接口;第二句话是:虚函数既继承接口,也提供了一份默认实现;第三句话是:普通函数既继承接口,也强制继承实现。这里假定讨论的成员函数都是public的。这里回顾一下这三类函数,如下:class BaseClass{public: void v...原创 2018-03-29 09:26:49 · 346 阅读 · 0 评论 -
Effective C++ 条款36、37、38
条款三十六:绝不重新定义继承而来的non-virtual函数class BaseClass{public: void NonVirtualFunction() { cout << "BaseClass::NonVirtualFunction" << endl; }};class DerivedClass: publi...原创 2018-03-29 16:29:03 · 354 阅读 · 0 评论 -
Effective C++ 条款 39、40、41
条款三十九:明智而审慎地使用private继承private继承的意义在于“be implemented in turns of”,这个与上一条款中说的复合模型的第二层含义是相同的,这也意味着通常我们可以在这两种设计方法之间转换,但书上还是更提倡使用复合来进行类的设计。private继承与public的继承是完全不同的,主要体现在两个地方:其一,public继承在子类中保持父类的访问权...原创 2018-03-29 16:51:32 · 348 阅读 · 0 评论 -
Effective C++ 条款 42、43
条款四十二:了解typename的双重意义顾名思义,typename有双重含意。只要你用过template,那么第一重含意一定知道,那就是声明模板的时候,我们既可以这样写: template <class T> 也可以这样写 template <typename T> 这两种写法并没有任何区别,都是标记T可以是符合隐式接口的任何类型,包括系统预定义类...原创 2018-03-29 17:34:33 · 535 阅读 · 0 评论 -
Effective C++ 条款 44、45
条款四十四:将与参数无关的代码抽离template标题上说“将与参数无关的代码抽离template”,这里的参数既可以指类型,也可以是非类型,我们先来看看非类型的情况。 假定我们要为矩阵写一个类,这个矩阵的行列元素个数相等,是一个方阵,因而我们可以对之求逆运算。因为方阵的元素可以有多种类型,同时方阵的维数(方阵大小)也可以不同,像下面这样,我们使用了模板:template <c...原创 2018-03-30 11:55:56 · 408 阅读 · 0 评论 -
Effective C++ 条款 24、46
条款二十四: 若所有参数皆需类型转换,请为此采用non-member函数class Rational{private: int numerator; int denominator;public: Rational(int n = 0, int d = 1): numerator(n), denominator(d){assert(denominator !=...原创 2018-03-30 17:21:54 · 370 阅读 · 0 评论 -
Effective C++ 条款 47、48、49
条款四十七:请使用trait classes来表示类型信息这一条款主要来讨论模板中迭代器的属性iterator_category,它可以通过类似于vector::iterator::iterator_category的方式来取得。到这里我们有必要学习一下STL迭代器的类型,总共有五种,分别是:input_iterator:只读,只能逐个前移output_iterator:只写,...原创 2018-03-31 15:27:48 · 364 阅读 · 1 评论 -
STL空间配置器入门
STL简介 STL(Standard Template Library,标准模板库),从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。谈及组件,那么我们就首先来简单谈下STL六大组件,其相关的设计模式使用,以及各组件之间的协作关系。六大组件简单介绍 1. 空间配置器:内存池实现小块内存分配,对应到设...转载 2018-04-03 17:36:36 · 275 阅读 · 0 评论 -
STL 第3章 迭代器
1、迭代器设计思维-STL关键所在迭代器:就是提供一种方法,在不需要暴露某个容器的内部表现形式情况下,使之能依次访问该容器中的各个元素。STL的中心思想在于:将数据容器(containers)和算法(algorithms)分开,彼此独立设计,最后再以一帖粘合剂将它们撮合在一起。只要对算法给予不同的迭代器,就可以对不同容器进行相同的操作。以算法find( )为例,它接受2个迭代器和1个”...转载 2018-04-03 22:45:27 · 253 阅读 · 1 评论 -
STL 第4章 序列式容器
vector1、vector特性(1)vector有自动扩容操作,每次扩容伴随着“配置新空间 / 移动旧数据 / 释放旧空间”的操作,因此有一定时间成本。 (2)vector提供了reserve接口,如果能够对元素个数有大概了解,可以一开始就分配合适的空间。 (3)vector的内存空间是连续的,对插入元素的操作而言,在vector尾部插入才是合适的选择。维护的是一个连续线性空间,...转载 2018-04-03 22:56:01 · 205 阅读 · 0 评论 -
STL 序列式容器(二)
stackstack是一种先进后出的数据结构,只有一个出口。允许新增元素、移除元素、取得最顶端元素。不允许有遍历行为。在SGI STL的源码<stl_stack.h>的设计中,它是基于某种容器作为底部结构的,默认容器是deque容器,用户也可以自己指定容器的类型。stack不提供走访功能,也不提供迭代器。stack源码如下:template <class T,...原创 2018-04-04 10:54:51 · 185 阅读 · 0 评论 -
STL排序
stl 算法库中提供的排序相关算法主要有以下几种,除了 q_sort 定义在 cstdlib 头文件中,其余都定义在 algorithm 头文件。 以上排序算法默认按照升序排列,若需要降序排列,可以指定比较器comp为 greater<type>() ( #include < functional > ) 。对于 C/C++ 非内置类型,需要提供 仿函数、lambda...转载 2018-04-04 11:25:07 · 740 阅读 · 0 评论 -
STL 关联式容器
1、关联式容器概述所谓关联式容器,观念上类似于关联式数据库:每笔数据都有一个键值(key)和一个实际值(value)。当元素被插入容器时,内部机制根据键值,按着一定的规则将元素置于特定的位置。关联式容器没有所谓头尾的概念(只有最大元素,最小元素),所以不会有类似push_back(),push_front(),pop_back(),pop_front,begin(),end()这样的操作。...转载 2018-04-04 11:40:06 · 382 阅读 · 0 评论 -
STL set相关算法
STL中定义的set要求元素不得重复且已经排序。而set算法要求的都是有序区间(输出也是有序的),但元素可以重复出现。STL提供了4个set相关的算法,分别是并集(union)、交集(intersection)、差集(difference)和对称差集(symmetric difference),这4个算法接受的set必须是有序区间,都至少接受4个参数,分别表示两个set区间。一般而言,set算...原创 2018-04-08 10:54:25 · 345 阅读 · 0 评论 -
C++多线程(一)thread类
与 C++11 多线程相关的头文件地方C++11 新标准中引入了四个头文件来支持多线程编程,他们分别是<atomic> ,<thread>,<mutex>,<condition_variable>和<future>。<atomic>:该头文主要声明了两个类, std::atomic 和 std::atomic_flag...原创 2018-04-10 16:28:29 · 89015 阅读 · 16 评论 -
c++ 多线线程(二)-mutex
一、mutex头文件的介绍Mutex 又称互斥量,C++ 11中与 Mutex 相关的类(包括锁类型)和函数都声明在 <mutex> 头文件中,所以如果你需要使用 std::mutex,就必须包含 <mutex> 头文件 mutex类4种 std::mutex,最基本的 Mutex 类。 std::recursive_mutex...原创 2018-04-10 17:15:02 · 1252 阅读 · 1 评论 -
c++ 11 多线线程 future
std::promise 类介绍promise 对象可以保存某一类型 T 的值,该值可被 future 对象读取(可能在另外一个线程中),因此 promise 也提供了一种线程同步的手段。在 promise 对象构造时可以和一个共享状态(通常是std::future)相关联,并可以在相关联的共享状态(std::future)上保存一个类型为 T 的值。可以通过 get_future 来...原创 2018-04-14 21:19:13 · 567 阅读 · 0 评论 -
C++ 不使用virtual实现多态
不使用virtual实现多态可以用成员函数指针完成。成员函数指针形式:返回类型(A::*指针名)(形参表)其中A是类类型,即这个指针是指向A类的成员函数的函数指针例如:int(A::*P)(int,int)这是一个指向 “A类的带有两个int型形参且返回值是int的成员函数” 的指针,指针名是P。#include<iostream>using namespace ...转载 2018-04-30 17:44:33 · 1833 阅读 · 0 评论 -
默认构造函数详解
错误认识1:若程序员没有自己定义无参数的构造函数,那么编译器会自动生成默认构造函数,来进行对成员函数的初始化。错误认识2:编译器合成出来的default constructor会明确设定'“class内每一个data member的默认值”。但这两种种认识是有误的,不全面的。正确认识:默认的构造函数分为有用的和无用的,所谓无用的默认构造函数就是一个空函数、什么操作也不做,而有用的默认构造函数是可以...转载 2018-05-10 11:20:26 · 23489 阅读 · 2 评论 -
哈希表(散列表)原理详解
一、什么是哈希表? 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。记录的存储位置=f(关键字)这里的对应关系f称为散列函数,又称为哈希(Hash函数),采用散列技术将记录存储在一块连续的存储空间中,这块连续存储...转载 2018-05-20 17:49:24 · 1346 阅读 · 1 评论 -
迭代器失效: 典型的迭代器失效.
迭代器失效: 典型的迭代器失效.首先对于vector而言,添加和删除操作可能使容器的部分或者全部迭代器失效。那为什么迭代器会失效呢? vector元素在内存中是顺序存储,试想:如果当前容器中已经存在了10个元素,现在又要添加一个元素到容器中,但是内存中紧跟在这10个元素后面没有一个空闲空间,而vector的元素必须顺序存储一边索引访问,所以我们不能在内存中随便找个地方存储这个元素。于是vec...原创 2018-05-22 21:28:28 · 256 阅读 · 0 评论 -
c++文件读写
fstream提供了三个类,用来实现c++对文件的操作。(文件的创建、读、写)。 ifstream – 从已有的文件读 ofstream – 向文件写内容 fstream - 打开文件供读写 文件打开模式: ios::in 读 ios::out 写 ios::app 从文件末尾开始写 ios::binary 二进制模式 ios::nocreate 打开一个文件时,如果文件...原创 2018-05-22 21:41:53 · 749 阅读 · 0 评论 -
智能指针
使用c++,除了c++的语法外,指针是我们面临的最的大一个问题,由于使用不当就会导致程序意外退出,或着内存的占用越来越多,总结起来这些错误由以下三个原因造成。 1 野指针:指针指向的内存已经被释放,但是我们还在使用该指针,或者还在使用之前指向的指针,此时程序会崩溃,也有可能导致已经释放的内存被重新分配给程序使用,造成意想不到的后果。 2 重复释放:程序尝试释放已经被释放的内...原创 2018-05-24 10:52:38 · 270 阅读 · 0 评论 -
c++ traits
当函数,类或者一些封装的通用算法中的某些部分会因为数据类型不同而导致处理或逻辑不同(而我们又不希望因为数据类型的差异而修改算法本身的封装时),traits会是一种很好的解决方案。本以为能很简单的描述它,谁知道还是用了如此长的句子才说明清楚,相当的惭愧。大家只要有个大概的概念就ok了,甚至即使完全没概念也没关系,下面会通过实际代码来说明。#include <type_traits>...转载 2018-05-24 16:31:34 · 495 阅读 · 1 评论 -
STL空间配置器
STL空间配置器:1.空间配置器三个文件stl_construct.h 这里定义了全局函数construct()和destroy(),负责对象的构造和析构。stl_alloc.h文件中定义了一、二两级配置器,彼此合作,配置器名为alloc. stl_uninitialized.h 这里定义了一些全局函数,用来填充(fill)或复制(copy)大块内存数据,他们也都隶属于STL...原创 2018-05-24 17:25:59 · 177 阅读 · 0 评论