
C++ 语言
文章平均质量分 69
万木春《Linux 后端开发工程实践》
这个作者很懒,什么都没留下…
展开
-
C++ string类常用函数
string类的构造函数:string(const char *s); //用c字符串s初始化string(int n,char c); //用n个字符c初始化此外,string类还支持默认构造函数和复制构造函数,如string s1;string s2="hello";都是正确的写法。当构造的string太长而无法表达时会抛出length_error异常string类的字符原创 2010-02-20 17:23:00 · 983 阅读 · 0 评论 -
面向对象编程VS泛型编程
面向对象编程VS泛型编程1、面向对象浅析 OOP是对data&&operation的封装,是对同类事物的抽象,跟结构化编程相比它更接近自然语言。继承使得OO具有了更强的表达能力,进一步地接近了自然语言的属性。而多态则是OO的最为巧妙和强大的地方,它催生了一系原创 2011-09-20 23:51:15 · 2330 阅读 · 0 评论 -
输出全排列的两种方式
输出全排列的两种方式 在暴力求解问题中,我们经常会枚举全排列,在此我列了列出了两种枚举全排列的两种方式。已输出1-5的全排列为例。 方式1:用回溯算法(深度优先遍历DFS)/** * Author: ACb0y * FileName: Test.c原创 2011-09-22 23:09:15 · 1334 阅读 · 0 评论 -
Unix/Linux线程同步互斥量的使用
Unix/Linux线程同步互斥量的使用 在main函数中创建3个子线程,并实时输出当前子线程数,当每创建一个子线程的时候,就对线程数变量加一,每个子线程运行3秒,3秒之后对子线程数变量值减一。当线程数为0时主线程退出。在对子线程数的读写过程中都使用到了线程同步的原创 2011-10-12 23:19:43 · 1992 阅读 · 0 评论 -
UVa 489
题意: 给定两个字符串,第一个串是用来匹配的,从第二个串的第一个字符开始匹配,如果第二个串中的字符在第一个串出现,则表示猜中了,第一个串中的相同的那个字符都算被猜中;如果没有出现则表示猜错,同样的猜错只算一次。在整个匹配的过程中,如果在还没猜错7次之前,第一个原创 2011-10-01 01:12:37 · 3227 阅读 · 0 评论 -
在Unix/Linux下模拟双机热备(客户端自适应方式)
在Unix/Linux下模拟双机热备(客户端自适应方式) 最近突然对双机热备的切换的过程产生了浓厚的兴趣。晚上动手写了份代码模拟了,双机切换的过程。该模拟方式是通过客户端自适应的方式来实现。当一个客户端发现链接的服务器关闭之后,便链接备用服务器。具体描述如下:原创 2011-10-17 02:33:55 · 3255 阅读 · 4 评论 -
接口完备的高精度整数计算类
接口完备的高精度整数计算类 做ACM的时候经常会遇到高精题,把自己封装好的高精类跟大家分享。实现方式就是模拟每个位的计算,把每个位的数字保存到数组中。具体实现可以看代码,都有注释。代码如下:/* Author: ACb0y FileN原创 2011-10-18 23:21:29 · 1714 阅读 · 0 评论 -
Unix/Linux创建一个线程
Unix/Linux创建一个线程 使用Unix/Linux的系统接口pthread_create()函数创建一个新的线程,主线程和新线程一直输出消息。注意用g++编译的时候要加 -lpthread,即需要链接线程库。源代码如下:#include #includ原创 2011-10-08 23:30:38 · 6505 阅读 · 0 评论 -
一个好玩的小游戏破解。
游戏介绍: 这个游戏和推箱子类似,就是给你有限的操作数,每次操作只能把箱子左移或右移,然后箱子会掉落,最后把3个以上连续相连的相同的箱子消去,如果在规定的操作数内你能让所有的箱子全部消去则通过游戏。 游戏连接地址:http://www.gamereclaim原创 2010-12-03 14:35:00 · 1882 阅读 · 3 评论 -
调用系统函数pthread_cancel取消进程的其他线程
调用系统函数pthread_cancel取消进程的其他线程 先在主线程中创建一子线程,在子线程中一直输出运行了多少时间,在主进程监控,当发现子线程已经运行10秒的时候,取消子线程。Demo代码如下:注意编译的时候要加 -lpthread 选项,即unix原创 2011-10-10 23:04:13 · 1749 阅读 · 0 评论 -
基于策略(policy)的类设计方法
基于策略(policy)的类设计方法通常类的功能是复杂的,而基于策略(policy)的设计方面把类的功能分离出来,变成粒度小的模块,每个模块完成不同的策略,通过不同的策略模块有序的组装从而实现整个类复杂的功能。将class分解成policies时,要遵守两条重要的准则。第一,把你的class内的“设计决定”局部化、命名、分离出来。第二,找出正交的policies,也就是彼此之间无交互左右、原创 2012-08-20 00:46:36 · 1288 阅读 · 0 评论 -
一起来学POSIX thread 之 综合应用——线程池
一起来学POSIX thread 之 综合应用——线程池1、为什么需要线程池?部分应用程序需要执行很多细小的任务,对于每个任务都创建一个线程来完成,任务完成后销毁线程,而这就会产生一个问题:当执行的任务所需要的时间T1小于等于创建线程时间T2和销毁线程时间T3总和时即T1 ,应用处理任务的响应能力会大大减弱,从而影响了应用程序性能,为了解决这类问题,线程池技术提供了很好的解决方案。原创 2013-02-14 22:26:19 · 3065 阅读 · 2 评论 -
虚函数、虚继承对sizeof的影响
虚函数、虚继承对sizeof的影响1、一个空类的大小代码如下:#include using namespace std;class A{};int main(){ cout << "A size = " << sizeof(A) << endl; return 0;} 输出结果为:分析:空类大小为1,编译器安插一个char给空类,用来标记它的每原创 2013-04-19 14:08:48 · 2637 阅读 · 0 评论 -
memcpy Linux内核实现引发的思考:为什么嵌入式汇编中不用指定段寄存器
memcpy Linux内核实现引发的思考:为什么嵌入式汇编中不用指定段寄存器最近买了王爽的汇编语言和Linux内核完全注释,准备开始好好学习一下汇编语言,并看看早期的Linux(0.11版本)源代码实现。之前舍友面试TX是被问过memcpy什么时候不能用,这种问题如何解决?答:当dest,src都指向同一个数组且dest>src,那么当n大于abs(dest > src),则这个时候原创 2013-05-18 11:21:27 · 3404 阅读 · 0 评论 -
extern “C” 陷阱
extern “C” 陷阱extern “C”通常使用在C++中,由于C++支持函数重载,命名空间等技术,故C++编译器在编译C++代码时会对函数进行签名,也就是说编译后的函数名将发生变化。例如我们有如下的代码:test.cppint fun(int a){///nothing.} 在Ubuntu下用g++编译这个cpp文件获取它的目标文件test.o,命令:原创 2013-06-04 22:27:10 · 3005 阅读 · 0 评论 -
unix/linux中书中一直提到的“ourhdr.h”文件内容
/*Our own header, to be included after all standard system headers*/#ifndef __ourhdr_h #define __ourhdr_h #include /*for definition of errno */#include /*ANSI C header file*/#includ原创 2011-06-13 09:02:00 · 2901 阅读 · 0 评论 -
数字字符串转整型数据的4种方法
数字字符串转整型数据的4种方法<br />在项目开发中,我们经常需要把数字字符串(值在整型数据的能够表示的范围内)转换成整型数据,这里我总结C/C++中4种不同转换方式:<br />1、使用system call调用atoi()来实现。<br />2、使用system call调用sscanf()来实现。<br />3、使用C++的字符串流对象来实现。<br />4、自己手动转换。<br />Demo代码如下:<br />/* FileName: main.cpp Author: ACb0y C原创 2011-03-27 23:40:00 · 6626 阅读 · 0 评论 -
C字符串的三种遍历方式
C字符串的三种遍历方式C字符串是用char [],字符数组来表示的,对于字符串的变量通常有两种,在这里中总结一下。代码如下:#include using namespace std;void foreachStringOne(char * str){ int len = strlen(str); for (int i = 0; i原创 2011-03-19 22:22:00 · 40500 阅读 · 1 评论 -
extern "C" 浅析
extern "C" 浅析 因为C++中允许同名函数存在,所以编译器会对函数名重新编码。当C++代码包含C语言的头文件时,重新编码的函数名如果与C语言库中的原函数名不一致,就会造成找不到函数的情况。为了让用C语言实现的函数可以在C++中调用,需要在头文件中实现的函数可以在C++中调用,需要在头文件中加点东西就可以了。#ifdef __cplusplusextern "C" {#endif#include #include void str_reverse(char *原创 2010-12-12 11:07:00 · 733 阅读 · 0 评论 -
钱能C++语言读书笔记(九)类型转换之动态转型(dynamic_cast)
类型转换之动态转型(dynamic_cast)<br /> <br /> <br />多态可以扩展到每一个对象可以动态的被识别,从而区分类型做只有该类型才有的操作,而不是虚函数规定的操作,这要依赖于类型的动态转换。例如一个Account * 的容器中,针对以下对象进行操作:Savings类对象,余额增加以1%计算的利息。Checking类对象,余额增加以0.05%计算利息。<br />Demo代码如下:<br />/* FileName: TyepConversion.cpp Author: ACb原创 2011-02-26 01:08:00 · 1890 阅读 · 0 评论 -
C++读书笔记之静态转换(static_cast)
C++读书笔记之静态转换(static_cast)<br />相对动态类型转换,静态类型转换则做范围更广的转换,但前提是必须是相关的类型,也就是说,编译器必须认为是可理解的,例如,一个非多态的类层次结构,祖孙对象的指针互易。如,研究生对象指针到学生对象指针的转换,或反之。由于void *到任何类型指针都可以进行想融性的转换,所以,void *到学生对象的指针转换也可以由static_cast来进行,还是从局部堆空间申请的空间转换为整形数组空间等。甚至有时候,要将void * 转到多态对象的指针,也要先经过s原创 2011-02-28 00:11:00 · 3180 阅读 · 1 评论 -
C/C++内存泄露故障(Memory Leak Faults)之简单篇
C/C++内存泄露故障(Memory Leak Faults)之简单篇Demo代码如下:/* FileName: MemoryLeakFaults.cpp Author: ACb0y Create Time: 2011年2月26日22:09:59 Last modify Time: 2011年2月26日22:53:04 */#include using namespace std;typedef int type;struct node { type原创 2011-02-26 22:56:00 · 2043 阅读 · 0 评论 -
C++内存泄露(Memory Leak Faults)之高级篇
C++内存泄露(Memory Leak Faults)之高级篇<br /> 如果在构造函数中有申请内存的操作,且在其他程序中有两个对象直接或间接的赋值操作,如果没有对“=”运算符进行重载定义,则会产生两次释放同一次内存操作的错误。该错误为第7类的内存错误。<br />Demo代码如下:<br />/* FileName: MemoryLeakFault2.cpp Author: ACb0y Create Time: 2011年2月27日14:22:11 Last modify T原创 2011-02-27 15:17:00 · 1175 阅读 · 0 评论 -
C++读书笔记之抽象
C++读书笔记之抽象<br />抽象编程的关键在于界面的相对稳定性。但是,不变的事物是没有的,包括界面。如何使界面保持相对稳定,或者说如何设计和维护界面,便是恒久保持抽象编程质量的关键。<br />抽象类与与纯虚函数<br />抽象类:在类定义中至少声明一个纯虚函数。<br />纯虚函数:所谓纯虚函数是指被标明为不具体实现的虚函数。例如:我并不知道怎样实现virtual Account::withdrawal(),那么就不用勉强下一个定义,只要声明为纯虚函数就行了。纯虚函数一旦声明,就不用定义。纯虚函数的声原创 2011-02-28 20:57:00 · 781 阅读 · 0 评论 -
C++读书笔记之泛型编程&&虚函数表&&volatile
C++读书笔记之泛型编程模板编程就是泛型编程。就好像虚函数编程就是面向对象编程一样。于是,只要程序中用到了模板声明和定义,就是属于泛型编程了。然而从广义上说,泛型编程更讲究目的:模板设计的目的就是为了能得到多种类型的有效通用。原创 2011-02-28 21:51:00 · 1118 阅读 · 0 评论 -
C++读书笔记常量转换(const_cast)
C++读书笔记常量转换(const_cast)<br />编译是计较常量或常对象的写操作的,因此,如果将常量或常对象的地址赋给指针,那是绝对不干的,例如:<br />const int a = 1;<br />int & ra = a; //错<br />int * p = &a; //错<br />const int & cra = a; //ok<br />const int * cpA = &a; //ok<br />int b = 2; //ok<br />int & rb = b; //ok<br原创 2011-02-28 20:42:00 · 1963 阅读 · 0 评论 -
C++读书笔记之第四类类型转换(reinterpret_cast)
C++读书笔记之第四类类型转换(reinterpret_cast)第四种新的类型转换reinterpret_cast转换结果常常是由(编译器)实现所定义的,因此,reinterpret_cast?几乎是不可移植的。reinterpret_cast最常见的用法是用来在函数指针之间的一种类型转换。比如说,假设你有一个指针数组,这些指针指向特定类型的函数:typedef void (*FuncPtr) ();FuncPtr funcPtrArray[10];//funcPtrArray is a array of原创 2011-02-28 22:43:00 · 1369 阅读 · 0 评论 -
C++关键字之explicit
C++关键字之explicit<br />c++中一个关键字为explicit,这个关键字是用来表明系统不能默认调用类的转换构造函数,要进行类型转换构造函数的调用,需要显示调用。<br />Demo代码如下:<br />/* FileName: explicitDemo.cpp Author: ACb0y Create Time: 2011年3月3日11:49:23 */#include <iostream>using namespace std;//测试类class Tes原创 2011-03-03 11:54:00 · 835 阅读 · 0 评论 -
钱能C++语言读书笔记(一)
钱能C++语言读书笔记(一)1、 头文件的内容1.1函数的声明:int Fun(); void Max();1.2全局数据的声明:extern int n;1.3类型声明:class A{};1.4全局常量定义:const float PI = 3.1415926;1.5内联函数定义:inline void fn();1.6模板声明和定义:templateclass A {…};1.7名空间定义:namespace N{};1.8类型定义:enum Color{}; class A{};1.9预编原创 2011-02-22 16:36:00 · 859 阅读 · 0 评论 -
钱能C++语言读书笔记(五)
钱能C++语言读书笔记(五)<br /> <br />1、 在高级编程中,都是用无任何牵连的干净界面来分离编程的逻辑单位的,描述界面成为一种编程的高级技巧,多继承技术也十分积极地参与了界面描述。C++标准的未来发展趋势于淡化多重继承。<br />2、 过程化的编程是通过函数模块化的堆积来展开的,它是一种行为抽象的编程。而基于对象的编程是通过抽象数据类型描述的数据对象来展开的。它是一种数据抽象的编程。<br />3、 数据结构:一系列性质相同的数据组织成一定的逻辑结构并带有自身的一系列操作。<br原创 2011-02-23 22:52:00 · 829 阅读 · 0 评论 -
钱能C++语言读书笔记(二)
钱能C++语言读书笔记(二)<br /> <br />1、 有内存申请,也就有内存释放。一般来说,需要定义拷贝构造函数的类,也需要析构函数,不需要拷贝构造函数的类,也无须定义析构函数。所以析构函数与拷贝构造函数是成对出项的。<br />因为析构函数是没有参数的所以函数形式是唯一的,没有重载的析构函数。<br /> 析构函数在对象的生命周期行将结束的瞬时,由系统自动调用。因此,析构函数的调用不是通过显示语句表示的。<br />2、 转换构造函数<br />构造函数:Student(const原创 2011-02-22 21:48:00 · 754 阅读 · 0 评论 -
钱能C++语言读书笔记(四)
钱能C++语言读书笔记(四)多继承之虚拟继承(Virtual Inheritance)当一个类(A)从多个类继承(B和C)而来,而这些父类(B和C)中又有共同的父类(E),这样在最后的类A中就有祖父类E的两份拷贝,在多重继承中经常会出现这种情况,在C++在提供了虚拟继承来解决这个问题,通过虚拟继承的方式可以保证类A中只有祖父类E的一份拷贝。多继承之对象构造顺序(Mutli-Inheritance Object Constructing Order)含有多继承的构造函数按下列顺序被调用任何虚拟基类的构造函数按原创 2011-02-23 00:30:00 · 833 阅读 · 0 评论 -
钱能C++语言读书笔记(三)如何改变类成员的范围属性
钱能C++语言读书笔记(三)如何改变类成员的访问属性<br /> 在派生类中,可以调整成员的访问控制属性。例如:可以将公有成员调整为私有成员,将保护成员调整为公有成员。调整访问控制属性的前提是在派生类中该成员必须是可见的。例如,上述程序中的私有成员b1,不管如何继承,它都是不可见的。在派生类中要访问它必须通过基类的保护或公有成员函数,因此b1就无法在派生类中进行访问属性的调整,它在子孙类中永远是不可见的。<br /> 对于一个成熟的类设计来说,数据成员往往只有私有的,公有的不多见,那都是原创 2011-02-22 23:30:00 · 921 阅读 · 0 评论 -
钱能C++语言读书笔记(六)虚函数的限制
虚函数的限制1、只有类成员函数才能声明为虚函数。这是因为虚函数仅适用于有继承体系的类对象,所以普通函数不能声明为虚函数。2、静态成员函数不能是虚函数。因为静态成员函数不受对象的捆绑,即使形式上的捆绑。实际上也没有任何对象的信息,只有类的信息:void fn(Base & x){ x.Staticfn(); //只用了类的信息。 Base::Staticfn(); //调用静态成员的推荐方式。} 操作不受对象捆绑,也就失去了多态的条件。因为编译是在识别到对象的捆绑操作时,开原创 2011-02-23 23:30:00 · 850 阅读 · 0 评论 -
手把手教你实现自定义的应用层协议
1.简述互联网上充斥着各种各样的网络服务,在对外提供网络服务时,服务端和客户端需要遵循同一套数据通讯协议,才能正常的进行通讯;就好像你跟台湾人沟通用闽南语,跟广东人沟通就用粤语一样。实现自己的应用功能时,已知的知名协议(http,smtp,ftp等)在安全性、可扩展性等方面不能满足需求,从而需要设计并实现自己的应用层协议。2.协议分类2.1按编码方式二进制协议 比如网络通信运输层中的tcp原创 2017-03-11 17:03:07 · 8935 阅读 · 3 评论