C++
文章平均质量分 52
zzz1_1zzz
这个作者很懒,什么都没留下…
展开
-
迭代器失效的几种情况
本文根据常用的容器来总结迭代器失效的几种情况。1. 序列式容器:vector、deque,数组型或队列型数据结构。该数据结构分配在连续的内存中,当删除一个元素后,内存中的数据会发生移动以保证数据的紧凑。所以删除一个元素后,其他数据的地址发生了变化,之前获取的迭代器根据原有信息就访问不到正确的数据。解决方法:erase返回下一个有效迭代器的值,itVec=vecData.erase(itVec)。std::vector<int> vecData;vecData.push_back(原创 2021-04-14 16:12:09 · 1968 阅读 · 0 评论 -
关于需求分析的几点体会
在我前面写的一篇博文《如何写出让自己满意的代码》中,有读者在评论中提到了用户需求不确定导致在总体设计阶段总是无的放矢的问题。需求分析当然是非常重要的,甚至在某些情况下比总体设计还更重要。那么,如何理解需求分析呢? Google一下关键字“需求分析”,网上已经有很多相关的文章了,有不少已经写得像教科书一样全面准确,还提供了一些最佳实践的分类方法。我这篇就从个人经验方面谈一点自己的体转载 2017-04-02 19:35:20 · 3696 阅读 · 2 评论 -
23种设计模式分析(7):行为型模式
1.1.21 Strategy策略模式 Strategy(策略)模式又称Policy模式。GOF《设计模式》一书对Strategy模式是这样描述的:定义一系列的算法,把他们一个个封装起来,并且使它们可相互替换。Strategy模式使算法可独立于使用它的客户而变化。 这里的算法并非狭义的数据结构或算法理论中所讨论的KMP、shell sort等算法,而是指应用程序设计中不同的转载 2017-03-25 21:59:22 · 569 阅读 · 0 评论 -
23种设计模式分析(6):行为型模式
1.1.17 Iterator迭代器模式 Iterator模式定义:提供一个方法顺序访问一个聚合对象的各个元素,而又不暴露该对象的内部表示。 Iterator(迭代器)模式又称Cursor(游标)模式,它是运用于聚合对象的一种模式,通过运用该模式,使得我们可以在不知道对象内部表示的情况下,按照一定顺序(由iterator提供的方法)访问聚合对象中的各个元素。 It转载 2017-03-24 22:25:32 · 822 阅读 · 0 评论 -
23种设计模式分析(5):行为型模式
1.1.13 Observer观察者模式 Observer(观察者)模式又被称作发布-订阅(Publish-Subscribe)模式,是一种对象的行为型模式。《设计模式》一书对Observer是这样描述的:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并自动更新。 Observer模式的功用,是希望两个(或多个)对象,我们称转载 2017-03-24 22:23:37 · 456 阅读 · 0 评论 -
C++使用线程函数pthread_create时,调用的成员函数要定义为静态成员函数
今天在进行多线程编程的时候遇到了一个编译问题:error: argument of type ‘void (PIAMW::Communicator::)()’ does not match ‘void* (*)(void*)’ 后来发现将线程处理函数声明为static类型,问题得解。 其实这个原因很简单,当把线程函数封装在类中,this指针会作为默认的参数被传进原创 2017-04-07 17:16:06 · 3550 阅读 · 2 评论 -
23种设计模式分析(4):结构型模式
1.1.9 Composite复合模式 Composite(复合、合成、组合)模式是一种结构型模式,定义:将对象组合成树形结构以表示“部分-整体”的层次结构,它使得客户对单个对象和复合对象的使用具有一致性。 这里的复合对象是很多单个对象的“组合”,而复合对象与单个对象又有共同的特征和操作。我们往往总是希望用一致的方式访问不同类型的对象,不论这个对象是同一类系中类型A的对转载 2017-03-22 13:53:01 · 633 阅读 · 0 评论 -
23种设计模式分析(3):结构型模式
1.1.6 Adapter适配器模式 GOF《设计模式》一书对Adapter模式是这样描述的:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使原本由于接口不兼容而不能一起工作的类可以一起工作。这段话大致是说:我们需要一种方式,为一个功能正确但接口不合的对象创建一个新接口。 我们经常碰到要将两个没有关系的类组合在一起使用。第一解决方案是:修改各自类,但是如转载 2017-03-22 13:51:26 · 422 阅读 · 0 评论 -
23种设计模式分析(2):创建型模式
1.1.3 Singleton模式 保证一个类只有一个实例,并提供一个访问它的全局访问点。单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。UML类图如下:图3-1 单例模式 类和对象之间的关系为: Singleton(单例):提供了一个instance的方法,让客户可以使转载 2017-03-20 21:26:49 · 384 阅读 · 0 评论 -
基础练习——01子串
问题描述对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:0000000001000100001100100请按从小到大的顺序输出这32种01串。输入格式本试题没有输入。输出格式输出32行,按从小到大的顺序每行一个长度为5的01串。样例输出00000000010001000011以下部分省略>原创 2017-03-10 21:35:43 · 899 阅读 · 1 评论 -
面向对象编程(一)——总结(扩展)
面向对象编程(一)——总结(扩展)1. 类/对象大小的计算——(见面向对象编程(三)——虚继承对C++对象模型造成的影响)1) 类大小计算遵循结构体对齐原则;2) 类的大小与数据成员有关与成员函数无关3) 类的大小与静态数据成员无关4) 虚函数对类的大小的影响5) 虚继承对类的大小的影响2. 对象作用域与生存期四种对象:1) 栈对象隐含调用构原创 2017-03-07 15:08:26 · 410 阅读 · 0 评论 -
面对对象设计原则
与设计模式相关的是设计原则。设计原则更像是理论,而设计模式是这种理论的具体体现。 每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题解决方案的核心。设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案。面向对象设计模式描述了面向对象设计过程中、特定场景下、类与相互通信的对象之间常见的组织关系,包括它们的角色、职责、协作方式几个方面。 从编程语言来看,各种面向对象编程语转载 2017-04-02 19:37:03 · 471 阅读 · 0 评论 -
如何写出让自己满意的代码
最近出于学习目的写一个管理系统,越到后边,越觉得自己前边的代码写得烂。前辈,我想让代码写得更好一点,能不能谈谈你的经验,给我指点一下!” 我在回复里刚写了几句,就意识到140个字很难把我的想法说清楚,本着知无不言言无不尽的好为人师精神,我决定把我的回答写成一篇博文。 首先要说明的是,我写这篇博客并不代表本人觉得自己的代码写得有多好。事实上我很清楚自己的水平,作为一个做应用系统的转载 2017-03-26 21:41:29 · 429 阅读 · 0 评论 -
UML类图关系(C++)
♀ 双向关联(Association)CAssociation1和CAssociation2可以互相调用对方的公共成员函数和成员变量。代码触析:[cpp] view plain copyclass CAssociation1 { private: CAssociation2* m_pAssociation2; }; class CAssociation2 { privat...转载 2018-03-12 14:40:28 · 1092 阅读 · 0 评论 -
C++继承中的成员访问控制
由基类到派生类的过程中,在派生类里如何访问基类成员,以及派生类对象如何访问基类成员,是根据派生类在从基类派生时是以什么方式进行的派生:public、protect或者private。下面说一下在这三种派生方式下成员函数和成员变量的访问和修改权限。派生类是指直接派生类!【代码1】123456789原创 2017-09-10 14:34:57 · 592 阅读 · 0 评论 -
C语言实现面向对象的思想(实现封装、继承和多态)
由于C语言是面向过程的语言,在处理比较大的项目时,结构上会显得有些松散。管理起来不免力不从心。其实在使用C语言写程序的过程中,也可以引入一些面象对象的思想。下面我们主要来谈谈如何用C语言把这些思想表达出来:1. 封装这个最简单了,C语言中虽然没有类,但有struct。这可是个好东西。我们可以在一个struct中存入数据和函数指针,以此来模拟类行为。[cpp] vie转载 2017-09-17 22:25:55 · 987 阅读 · 0 评论 -
c++简单线程池实现
线程池,简单来说就是有一堆已经创建好的线程(最大数目一定),初始时他们都处于空闲状态,当有新的任务进来,从线程池中取出一个空闲的线程处理任务,然后当任务处理完成之后,该线程被重新放回到线程池中,供其他的任务使用,当线程池中的线程都在处理任务时,就没有空闲线程供使用,此时,若有新的任务产生,只能等待线程池中有线程结束任务空闲才能执行,下面是线程池的工作原理图:我们为什么要使用线程池呢原创 2017-09-13 21:36:27 · 627 阅读 · 0 评论 -
C++11 STL中的容器
C++11 STL中的容器==================================================一、顺序容器:vector:可变大小数组;deque:双端队列;list:双向链表;forward_list:单向链表;array:固定大小数组;string:与vector相似的容器,但专门用于保存字符。原创 2017-07-26 09:44:34 · 309 阅读 · 0 评论 -
c++设计一个不能被继承的类
摘要:使用友元、私有构造函数、虚继承等方式可以使一个类不能被继承,可是为什么必须是虚继承?背后的原理又是什么?用C++实现一个不能被继承的类(例1) 1 #include 2 using namespace std; 3 4 template 5 class Base{ 6 friend T; 7 private: 8 Base转载 2017-08-02 11:14:27 · 369 阅读 · 0 评论 -
有关析构函数和构造函数的几点说明
有关析构函数和构造函数的几点说明:构造函数和析构函数都不能被继承(构造函数和析构函数是用来处理对象的创建和析构的,它们只知道对在它们的特殊层次的对象做什么。所以,在整个层次中的所有的构造函数和析构函数都必须被调用而不能被继承。)构造函数可以重载,析构函数不可以重载(构造函数可以有参数,析构函数没有参数。)构造函数不可以是虚函数,析构函数可以是虚函数(1. 构造函数为什么不能为原创 2017-08-16 09:56:22 · 640 阅读 · 0 评论 -
从C到C++的升级之register关键字的升级
register关键字的升级1) C语言中的registerA. 请求编译器尽可能地将变量存在CPU内部寄存器中,省去了CPU从内存中抓取数据d额时间,提高程序地运行效率;B. 频繁被访问的变量用register修饰;C. register只能修饰局部变量,不能修饰全局变量(全局变量会被多个程序访问,当前进程声明的register变量,其他进程不能访问)和函数;D.原创 2017-02-15 23:02:43 · 407 阅读 · 0 评论 -
C++中SendMessage与PostMessage的区别
概述Send有发送的意思,而Post具有投寄的意思。 联想一下现实生活中我们写信(很久很久以前。。。。)来记就很简单了: Send: 相当于邮寄员,他会将快件亲手交给收件人,并且需要收件人签字,他才闪人。而在消息机制中,就是说,系统(邮寄员)会将收到的消息(邮局分发)直接发送到某个窗口的窗口过程(收件人),并且需要该窗口作出处理(收件人签字)才返回。 这东东就是Sen转载 2017-07-13 10:12:01 · 9048 阅读 · 0 评论 -
对象的使用
对象的使用1. static关键字(1)static成员1) 对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量。2) 如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量,这时我们可以用类的静态成员来解决这个问题。3) 非static数据成员存在于类类型的每个对象中,static数据成员独立该类的任意对象存在,它是与类关联的对象,不与类对原创 2017-03-06 15:54:17 · 283 阅读 · 0 评论 -
23种设计模式分析(1):创建型模式
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。 GoF(“四人帮”,指Gamma, Helm, Johnson & Vliss转载 2017-03-19 17:36:34 · 1216 阅读 · 0 评论 -
拷贝构造函数
1. 拷贝构造函数功能:使用一个已经存在的对象来初始化一个新的同一一类型的对象声明:只有一个参数并且参数为该类对象的引用如果类中没有说明拷贝构造函数,则系统自动生成一个缺省复制构造函数,作为该类的公有成员2. 拷贝构造函数的调用情况1) 用已有对象初始化对象会调用拷贝构造函数2) 当函数的形参是类的对象,调用函数时,进行形参与实参结合时使用3) 当函数的返回值原创 2017-03-05 22:44:34 · 470 阅读 · 0 评论 -
构造函数
构造函数:实例化一个对象时调用构造函数1) 特点A. 函数名和类名完全相同B. 不能定义构造函数的类型(返回类型),也不能使用voidC. 通常情况下构造函数应声明位公有函数,否则它不能像其他成员函数那样被显式地调用D. 构造函数被声明为私有有特殊的用途E. 构造函数可以有任意类型和任意个数的参数,一个类可以有多个构造函数(重载)2) 默认构造函数A原创 2017-03-01 22:35:33 · 263 阅读 · 0 评论 -
学习C++的优势
学习C++的优势A. 强化C语言编程能力、提高编程的代码质量B. 帮助学习其他编程语言a) 现代软件产品架构图具体示例:(安卓——商场收银系统)b) 学习其他编程语言的必要性其他编程语言:C、C++、java、PHP、python、shell、C#、OC、go前端+后台:C++、java、PHP、C#、OC(面向对象)脚本语言:python、shel原创 2017-02-12 23:44:48 · 1146 阅读 · 0 评论 -
面向过程编程VS面向对象编程
面向过程编程VS面向对象编程A. 面向过程编程的特点a) C语言的特点优点:Ø 简洁紧凑,灵活方便;Ø 结构化语言;Ø 语法限制不太严格,程序设计自由度大;Ø 允许直接访问物理地址,可以直接对硬件操作;Ø 生成目标代码质量高,程序执行效率高;Ø 具有较高的可移植性缺点:Ø 灵活性、维护性、复用性、扩展性差b) 面向过程的编程特点面向过程程序原创 2017-02-11 22:44:31 · 513 阅读 · 0 评论 -
嵌入式软件工程师岗位需求
嵌入式软件工程师岗位需求A. 嵌入式软件开发工程师岗位职责a) 负责嵌入式操作系统的移植和应用开发;b) 负责移动互联网的应用开发;c) 负责嵌入式系统图形界面的开发;d) 负责系统及软件设计文档的编写;e) 对编码进行调试和确认,完成系统组装及测试工作;f) 对测试结果进行分析研究,给出问题的解决方案。B. 嵌入式软件开发工程师岗原创 2017-02-11 22:42:55 · 1863 阅读 · 0 评论 -
从C到C++的升级之命名空间和数据类型
1. 命名空间-namespace1) 命名空间C语言中只有一个全局作用域C++中提供命名空间,将全局作用域分成不同部分2) 如何定义命名空间namespace First{ int i = 0;}namespace Second{ int i = 1;}3) 如何使用命名空间using namespace Firs原创 2017-02-20 18:13:28 · 332 阅读 · 0 评论 -
从C到C++的升级之函数升级
函数升级1) 内联函数A. 内联函数的使用define MAX(a, b)(a)> (b) ? (a) : (b)inline int max(int a, int b){returna > b ? a : b;}B. 内联函数与带参宏函数的区别a) 内联函数调用时,要求实参和形参的类型一致, 另外内联函数会先对实参表达式进行求值,然后传递给形参;而宏函原创 2017-02-20 18:12:35 · 383 阅读 · 0 评论 -
区别(类、成员、属性、对象、方法)
区别(类、成员、属性、对象、方法)例子:日常生活中的所有东西都是对象,而具有同种属性的一类事物被称为类,人、动物、植物、车都是类(是抽象的),而小明这个人就是一个具体的对象。对象是类的实例化,比如唐伯虎点秋香里面的小强是蟑螂的实例化。我们一般不会用类的名称类称呼一个对象。周星驰说“小强,你死得好惨啊!”,而不是说“蟑螂,你死得好惨啊!”。这里“蟑螂”是类名,而小强是对象的名称。原创 2017-02-28 21:38:16 · 2674 阅读 · 1 评论 -
从C到C++的升级之引用VS指针
引用VS指针1) 引用是给一个变量起别名,对引用的修改即对变量的修改2) 格式:类型 &引用名 = 变量名例如:int a = 1;int &b = a;//b是a的别名注:定义引用时一定要初始化,指明该引用变量是谁的别名3) 引用一般用于参数传递与返回值A. 作为函数形参:在C语言中:传递实参变量名只能使用不能修改,传递实参变量的地址既能使用又能修改;在C原创 2017-02-18 19:13:21 · 353 阅读 · 0 评论 -
嵌套类、局部类
嵌套类(内部类):在类内定义一个类class Test{public: class Inner{ public: void func(); int num;};private:};类外实现函数:void Test::Inner::func(){}类外调用类内的类的成员:Test t;t.Inner:原创 2017-02-27 21:09:34 · 261 阅读 · 0 评论 -
从C到C++的升级之内存分配与释放
内存分配与释放1) new与delete的使用A. C++中通过new关键字进行动态内存申请B. C++中的动态内存申请是基于类型进行的C. delete关键字用于内存释放D. int *p = new int;delete p;//变量申请E. char *p = new char[100];delete [] p;//数组申请2) new关键字与mal原创 2017-02-17 18:45:06 · 434 阅读 · 0 评论 -
面对对象编程介绍
面对对象编程介绍1. 什么是面对对象面向将系统看成通过交互作用来完成特定功能的对象的集合,每个对象用自己的方法来管理数据,也就是说只有对象内部的代码能够操作对象内部的数据。2. 面对对象的优点C++的维护性、复用性、扩展性好活字印刷的例子:v 活字印刷,解决问题v 1、要改,只需改文字即可,此乃可维护v 2、这原创 2017-02-21 20:38:52 · 330 阅读 · 0 评论 -
C++标准、开发工具即相关书籍
1. C++为什么难学?1) C++支持的编程范式过程式、数据抽象、基于对象、面向对象式、函数式、泛型形式、模板元形式(三大编程范式:过程式、面向对象式、泛型形式)设计模型:简单工厂模式、工厂模式、适配器模式、代理模式2) 值语义与对象语义值语义可以拷贝与赋值,对象语义不可进行拷贝与赋值2. C++ 语言有哪些标准?1) C++支之父:本贾尼·斯特劳斯特卢原创 2017-02-13 20:40:03 · 346 阅读 · 0 评论 -
算法练习——最小公倍数
问题描述 编写一函数lcm,求两个正整数的最小公倍数。样例输入一个满足题目要求的输入范例。例:3 5样例输出与上面的样例输入对应的输出。例:数据规模和约定 输入数据中每一个数的范围。 例:两个数都小于65536。 C++代码如下:#include using namespace std; int main() {原创 2017-03-18 22:08:53 · 850 阅读 · 0 评论 -
类的作用域
类的作用域类的前向声明——前向声明的类不能实例化前向声明后不能定义对象,但可定义对象指针或引用前向声明:在一个头文件定义的类中,存在另一个头文件中定义的类的对象class B;//前向声明class A{public:A();~A();private:B *b;//对象指针};#include “B.H”//包含头文件class A{publ原创 2017-02-26 21:31:30 · 219 阅读 · 0 评论 -
对象的存储模型
对象的存储模型对象在调用成员方法时,会传递一个this指针,保存成员地址。void initXYZ(int x, int y, int z){ this->x_ =x; this->y_ =y;this->z_= z;}原创 2017-02-25 23:42:53 · 290 阅读 · 0 评论