C++学习
文章平均质量分 77
黑帽子和猫
不要总当机会到来时,你才唏嘘“哎呀,那时我怎么怎么样就好。。。”,你已经错过很多次,记住这是最后一次
展开
-
C++左值和右值
此博文写的很好 c++中的左值与右值 c++11 中的 move 与 forward转载 2017-07-18 18:47:52 · 548 阅读 · 0 评论 -
STL与泛型编程<十四>:仿函数介绍
简介仿函数(functor)就是定义了operator()的一种型别(或实例化的对象),可以如下使用FunctionObjectType fo;...fo(...) //并不是使用函数fo(),而是调用fo的operator()函数明显其和函数的很像,只不过函数是在函数体内实现,而其实在operator()里实现相关功能,伪代码如下class FunctionObjectType{原创 2016-03-28 22:24:14 · 935 阅读 · 0 评论 -
C++设计模式<五>:Observe观察者模式
1.动机在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好滴抵御变化2.模式定义定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(object)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。3.例子看一个文件分割器的例子(以前磁盘小,经常需要文件原创 2016-04-09 15:14:54 · 1649 阅读 · 0 评论 -
STL与泛型编程<十八>:STL算法之非变动性算法(Nonmodifying algorithm)
1.元素计数(count和count_if)count声明:template <class InputIterator, class T>typename iterator_traits<InputIterator>::difference_type //返回值 count (InputIterator first, InputIterator last, const T& val){原创 2016-04-07 20:22:49 · 447 阅读 · 0 评论 -
STL与泛型编程<九>:迭代器相关辅助函数
STL为迭代器提供了三个辅助函数:advance(),distance()和iter_swap()。前二者提供给所有迭代器一些原本只有随机迭代器才有的能力:前进或后退多个元素,及处理迭代器之间的距离。最后一个允许你交换两个迭代器的值advance()可使迭代器前进声明如下#include <iterator>void advance(InputIterator& pos, Dist n)使名为p原创 2016-03-27 17:28:14 · 658 阅读 · 0 评论 -
STL与泛型编程<三>:deque
STL与泛型编程<三>:deque和vector很相似,也采用动态数组来管理元素,提供随机存取,逻辑结构如下, deque通常实作为一组独立区块,第一块朝某方向扩展,最后一块区块朝另一方向扩展 deque的能力与vector相比,deque的功能不同之处在于 1. 两段都能快速安插和溢出元素; 2. 存取元素时,deque的内部结构多一个间接过程,所以元素存取比vector慢; 3.原创 2016-03-06 17:55:57 · 546 阅读 · 0 评论 -
C++设计模式<四>:策略模式(Strategy)
1.动机在软件构件过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。2.模式定义定义一系列算法,把它们一个个封装起来,并且使它们可相互替换(变化)。该模式使得算法可独立使用它的客户程序(稳定)而变化(扩展,子变化)3.例子说明以下是一个关于各国税务的相关计算。 先看解法一(伪代码)enum TaxBa原创 2016-04-08 01:16:17 · 1097 阅读 · 0 评论 -
C++设计模式<三>:模板方法(Template Method 模式)
模式分类1. GOF-23模式分类 从目的来看: 创建型(Creational)模式:将对象的部分创建工作延迟到子类或其他对象,从而应对需求变化为创建时类型实现引来的冲击 结构性(structural)模式:通过类继承或对象组合获得更灵活的结构,从而应对需求变化为对象的结构带来的冲击 行为性(behavioral)模式:通过对类继承或对象组合来划分类与对象间的职责,从而应对需原创 2016-04-07 18:32:08 · 613 阅读 · 0 评论 -
C++设计模式<二>:面向对象设计原则
面向对象设计变化是复用的天敌,而面向对象设计的最大优势就是抵御变化面向对象设计原则1.依赖倒置关系(DIP) 高层模块(稳定)不应该依赖于底层模块(变化),二者都应该依赖于抽象(稳定) 抽象(稳定)不应该依赖于实现细节,实现细节应该依赖于抽象(稳定) 如上节 C++设计模式<一>:简介中的例子 其中MainForm(高层模块)应该是稳定的,而第一种方案(分解模式)却依赖于Lin原创 2016-04-07 15:46:33 · 1381 阅读 · 0 评论 -
C++设计模式<六>:Decorator装饰模式
“单一职责”模式 在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任。 典型模式 - Decorator - Bridge1.动机在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类原创 2016-07-18 21:16:04 · 1541 阅读 · 0 评论 -
C++设计模式<一>:简介
什么是设计模式每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心,这样,你就能一次又一次地使用该方案而不必做重复劳动两种思维底层思维 底层思维:向下,从微观角度理解对象构造 如语言构造,编译转换,内存模型,运行时机制等(我表示我还在底层思维上奋斗);其中向下需要深入理解三大面向对象机制:封装,隐藏内部实现继承,复用现有代码多态,改写对象行为抽象思维 抽象思维:原创 2016-04-07 01:27:57 · 680 阅读 · 5 评论 -
C++11 : unique_ptr
支持的操作 具体详见: http://www.cplusplus.com/reference/memory/unique_ptr/?kw=unique_ptr 或 http://zh.cppreference.com/w/cpp/memory/unique_ptr另附一些博客: C++ 11 创建和使用 unique_ptr C++11智能指针之unique_ptr 现代C++学习原创 2017-07-17 14:43:06 · 542 阅读 · 0 评论 -
C++避免编译警告unused
见 https://stackoverflow.com/questions/15763937/unused-parameter-in-c11#define UNUSED(expr) do { (void)(expr); } while (0)编译选项-Wall -Wextra -Werror -Wconversion -Wshadow原创 2017-06-21 23:25:53 · 11190 阅读 · 0 评论 -
Effective C++ <二>:构造,析构,赋值运算
如果这些函数出错的化,将会遍及整个class条款05:了解C++默默编写并调用哪些函数真讨厌,编译器会帮你添加上一些函数 如果你写下class Empty{};就好像如下class Empty{ public: Empty() {...}; //default构造函数 Empty(const Empty& rhs) {...} //copy构造函数原创 2017-06-03 22:19:50 · 392 阅读 · 0 评论 -
Effective C++ <一> :让自己习惯于C++
1. 视C++为一个语言联邦C++有四种使用方式 - C - Object-Oriented C++ - Template C++ - STL 不同部分的高效编程守则是不一样的 C++高效编程守则视状况而变化,取决于使用C++的哪那一部分2. 尽量以const,enum,inline替换#define常量的定义一般放在头文件,下面看看两种特殊情况 1. 定义常量指针const char原创 2017-06-02 17:03:19 · 422 阅读 · 0 评论 -
C语言不定长消息-柔性数组
定义: 柔性数组:数组大小待定的数组。 C语言中结构体最后一个元素可以是大小未知的数组。 C语言可以由结构体产生柔性数组柔性数组的结构如何只能堆上生成 柔性数组是C99的扩展,简而言之就是一个在struct结构里的标识占位符(不占结构struct的空间)C语言柔性数组在游戏前后端交换的过程中,经常会用到变成的消息体,因为有的内容的大小是位置的,例如一条微博,微博的内容大小是未知的。一般的做法转载 2017-04-03 21:27:12 · 549 阅读 · 1 评论 -
测试C++程序:使用Catch和Valgrind
1.引言最近写python用unittest模块做单元测试,才发现自己过去写C++居然都是手工测试。查了一番资料之后,发现Catch和Valgrind这两个工具可以很好地满足需求。测试C++程序时,我们通常会在意两件事:运行结果是否正确? 是否发生了内存泄漏? 第一件事所有编程语言都需要在意,通常是给程序各种输入,检验输出的正确性,Catch是一个轻巧的单元测试框架,学习起来非常容易; 第二件转载 2017-04-10 01:04:17 · 976 阅读 · 0 评论 -
boost noncopyable实现禁止类拷贝
最近使用boost noncopyable一点思考。 class noncopyable { protected: noncopyable() {} ~noncopyable() {} private: // emphasize the following members are private noncopyable( co转载 2017-03-22 15:54:43 · 516 阅读 · 0 评论 -
C++面向对象编程<十>:虚函数与多态
Inheritance with virtual functions继承主要需要搭配虚函数,见如下三种关系: non-virtual函数:你不希望derived class override(重新定义,重写)它; virtual函数:你希望derived class override(重新定义,重写)它,且你对它已有默认定义; pure virtual函数:你希望derived class一定原创 2016-02-23 22:01:08 · 840 阅读 · 3 评论 -
STL与泛型编程<十七>:STL算法简介及for_each()算法
首先使用STL算法,有几个头文件需要说明下#include <algorithm> //算法#include <numeric> //数值处理#include <functional> //仿函数或函数适配器简介所有的STL算法都用来处理一个或多个迭代器区间,第一个区间通常以起点和终点来表示,其他区间一般只需要提供起点就好;STL算法采用覆盖(overwrite)而非安原创 2016-04-06 23:40:19 · 2427 阅读 · 0 评论 -
STL与泛型编程<十二>:Stream(流)迭代器
ostream_iteratorostream迭代器可以将赋的值写入output stream中,它的实作机制与insert迭代器概念一致,唯一的区别在于ostream迭代器将赋值操作转换为operator<<,ostream迭代器的各个操作函数如下 其定义如下namespace std{ template<typename T, typename charT = char, typ原创 2016-03-28 21:08:40 · 820 阅读 · 0 评论 -
STL与泛型编程<十一>:Insert(安插)迭代器
介绍用来将“赋新值操作”转换为“安插新值”操作,通过这种迭代器,算法可以执行安插(insert)操作而非覆盖(overwrite)操作。所有insert迭代器都属于output迭代器。 - Insert迭代器的功能 通常算法会将数值赋值给标的迭代器,如copy()算法namespace std{ template<typename InputIterator, typename Out原创 2016-03-28 20:34:12 · 1004 阅读 · 0 评论 -
C++面向对象编程<九>:面向对象-类之间的关系
OOP面向对象:类与类之间的关系,分为三种:Inheritance(继承)、Composition(组合)、Delegation(委托) **基于对象:单一类的封装Composition组合,表示has-a关系看一个栗子,如图此class里有(has-a)deque,常用图来表示类之间的关系。 上面这张图包含一种设计模式:Adapter(适配),含义如下: 已经有deque,但客户需要queu原创 2016-02-23 20:46:45 · 887 阅读 · 2 评论 -
C++面向对象编程<八>:小练习之Big three函数
问题描述为 Rectangle 类实现构造函数,拷贝构造函数,赋值操作符,析构函数。 如下class Shape{ int no;}; class Point{ int x; int y;}; class Rectangle: public Shape{ int widt原创 2016-02-23 12:47:03 · 545 阅读 · 0 评论 -
C++面向对象编程<七>:堆栈、类模板、函数模板及其他补充
stack堆、heap栈stack:所谓栈就是存在于作用域的一块内存空间,如当你调用函数,函数本身就会形成一个stack用来放置它所接受的参数及local object,以及返回地址; heap:指操作系统提供的一块global内存空间,程序可能动态分配空间,并取得,并且要自己释放。 如下class Complex {...};...{ Complex c1(1,2);原创 2016-02-22 21:19:32 · 573 阅读 · 0 评论 -
C++面向对象编程<六>:Big Three,三个特殊函数
简介这里看class的另一个分类:class with pointer members. 先看String的声明#ifndef _MYSTRING_#define _MYSTRING_class String{ public: String(const char* cstr = 0); String(const String& str);原创 2016-02-22 15:47:57 · 1344 阅读 · 0 评论 -
C++面向对象编程<五>:小练习-Date类
问题描述为Date类实现如下成员: 1. 构造器,可以初始化年、月、日。 2. 大于、小于、等于(> 、< 、==)操作符重载,进行日期比较。 3. print() 打印出类似 2015-10-1 这样的格式。然后创建两个全局函数: 1. 第1个函数 CreatePoints生成10个随机的Date,并以数组形式返回 2. 第2个函数 Sort 对第1个函数CreatePoints生成的结原创 2016-02-22 12:13:30 · 1239 阅读 · 1 评论 -
C++面向对象编程<四>:类comlpex的完整代码
这里给出完整代码#ifndef __MYCOMPLEX__#define __MYCOMPLEX__class complex; complex& __doapl (complex* ths, const complex& r);complex& __doami (complex* ths, const complex& r);complex& __doaml (complex*原创 2016-02-21 23:31:39 · 832 阅读 · 0 评论 -
C++面向对象编程<三>:操作符重载
操作符重载-成员函数先看程序inline complex& _doapl(complex* ths, const complex& r) //do assignment plus { ths->re += r.re; ths->im += r.im; return *ths;}inline complex& complex::operator += (const co原创 2016-02-21 23:21:12 · 694 阅读 · 0 评论 -
C++面向对象编程<二>:构造函数
前置声明class complex;类的前置声明只是告诉将类的名称编译器,并未提供class的任何其他信息,因此前置声明使我们得以使用类的指针和引用,而不能使用类的对象,如下complex *p = 0; //定义一个类指针(class pointer)void func(const complex& ); //以complex作为数据型别但这样用就会出错complex obj;头文件声明原创 2016-02-21 22:55:00 · 602 阅读 · 1 评论 -
STL与泛型编程<二>:Vector
Vector模拟一个动态数组,其内存模型如下 Vector的能力vector将元素复制到内部的dynamic array中,是一个有序群集;vector支持随机存取,vector迭代器是一个随机存取迭代器 ,所以对任何一个STL算法都可以。大小(size)和容量(capacity)为什么vector比容器的通用操作多了个capacity()?就是因为 vector优异性能就是配置比其容纳的元素所原创 2016-03-06 16:56:19 · 537 阅读 · 0 评论 -
C++面向对象编程<十二>转换函数、explicit、class几种表现形式
conservation function,转换函数一个class类型转换为另外一个类型,如下例子#include <iostream>using namespace std;class Fraction{ public: Fraction(int num, int den=1) : m_num(num), m_den(den) {} oper原创 2016-02-24 21:17:50 · 708 阅读 · 0 评论 -
STL与泛型编程<十>:迭代器适配器(Iterator Adapters)之逆向迭代器
此类迭代器可以使得算法能够以逆向(reverse mode)模式,安插模式(insert mode)进行工作,也可以流(streams)的模式搭配工作逆向迭代器reverse迭代器是一种适配器,重新定义递增运算和递减运算,使其行为正好倒置,所有标准容器都允许使用reverse迭代器来遍历元素,例子#include <iostream>#include <list> #include <itera原创 2016-03-27 18:20:42 · 411 阅读 · 0 评论 -
STL与泛型编程<八>:迭代器简介
总述所有容器都定义其各自的迭代器型别(iterator types),所以不需要专门的头文件,但有的迭代器需要,如逆向迭代器,被定义在#include中,迭代器是一种“能够遍历某个序列内所有元素”的对象,它可以透过一般指针一致的接口来完成自己的工作。其主要分为以下几种,见图 - input(输入)迭代器 input迭代器只能一次一个向前读取元素,按顺序一个个传回元素值。注意input迭代器只原创 2016-03-22 22:58:38 · 536 阅读 · 0 评论 -
STL与泛型编程<五>:Sets和Multisets
set和multiset会根据特定的排序准则排序,自动将元素进行排序,不同之处在于multiset允许元素重复而set不允许。 其声明如下namespace std{ template<class T, class Compare = less<T>, class Allocator = allocator<T> > class set; template<class原创 2016-03-07 18:36:18 · 803 阅读 · 0 评论 -
STL与泛型编程<四>:List
List使用一个双向链表来管理元素。 List的能力List的内部结构与vector和deque截然不同,因此区别也很显著,如下 1. List不支持随机存取。所以在List遍历是很缓慢的行为 2. 任何位置安插与删除元素非常快 3. 安插和删除元素并不会造成指向其他元素的各个pointer,reference,iterator失效 List提供的成员函数也可以看出来它和vector以及d原创 2016-03-06 20:39:02 · 476 阅读 · 0 评论 -
STL与泛型编程<一>:容器的共通能力和共通操作
STL与泛型编程<一>:容器的共通能力和共通操作容器的共通能力所有的STL都必须满足一些共同的条件,三个最核心的能力是 1. “所有容器提供的都是”value语意”而非”reference语意”。这意味着STL容器所容纳的是你所安插的对象值,若要实现reference语意,可以让容器容纳指针 2. 总体而言,所有元素形成一个次序。每个容器都提供了“可返回迭代器”的函数 3. 一般而言,各项操作原创 2016-03-06 10:23:29 · 434 阅读 · 0 评论 -
STL与泛型编程<十五>:预定义的仿函数和仿函数适配器
如下图,STL中预定于的这些仿函数 使用请先头文件#include 由上图可以看出,总的来说可以分成一元仿函数(只有一个参数)和二元仿函数(两个参数);又可以分为:算术类,相对关系类,逻辑运算类。函数适配器(Function Adapters)调用原理分析binder1st and bind1st目的在于将无法匹配的仿函数适配成可以匹配的型别,类似于生活中的插座。先看一个例子1:给定一个v原创 2016-04-04 21:59:44 · 1188 阅读 · 0 评论 -
STL与泛型编程<六>:map和multimap
Map和Multimap将key/value pair当作元素,进行管理。它们可根据key的排序准则自动将元素进行排序。其声明如下namespace std{ template<class key, class T, class Compare = less<key>, class Allocator = allocator<pair<const Key, T> > >原创 2016-04-04 21:22:48 · 1678 阅读 · 0 评论 -
C++面向对象编程<十三>:template和reference
class template 、function template以及member template; class template 和 function template前面的文章讲过member template在标准库很多构造函数会出现。 语法如下 class就是个模板,而成员里还有个模板。T1、T2可以变化,U1、U2也可以变化。 见下面栗子(还是图比较清楚能描述意思) 再原创 2016-02-25 21:03:19 · 881 阅读 · 0 评论