![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
zhouzhenhe2008
这个作者很懒,什么都没留下…
展开
-
C++静态成员重新梳理
C++静态成员重新梳理原创 2022-07-02 10:52:40 · 79 阅读 · 0 评论 -
C/C++使用宏连接字符串
C/C++使用宏连接字符串原创 2022-07-02 09:33:51 · 687 阅读 · 0 评论 -
C++构造函数初始化类的特殊成员变量——类
A类、B类作为D的私有成员。构造函数,可以传参数把m_classA,m_classB初始化,也可以调用D类不传参数的构造函数初始化这两个成员,然后调用set方法设置参数。头文件#ifndef PATTERN_H#define PATTERN_Hclass A{public: A(int m); A(); void set(int m); void print()原创 2017-07-01 18:02:23 · 832 阅读 · 0 评论 -
适配器模式C++实现
适配器设计模式将一个类的接口转换为一个兼容的但不相同的接口。与代理模式的相似之处是,适配器模式也是一个单一组件的包装器,但适配器类的接口可以与原始类的不同。举个工作上用到的例子,比如一般的芯片厂商都会媒体播放的API,比如博通,提供了一个媒体播放类BcmMedia,BcmMedia有接口void start(char *filename)。我们可以设计一个适配器,对应用原创 2017-07-05 23:52:32 · 334 阅读 · 0 评论 -
外观模式C++实现
外观模式其实定义了一个高层接口,该接口为子系统中的一组接口提供一个一致的界面,使得这一子系统更加容易使用。(不关心底层函数的实现)比如,一个下班回家的动作:打卡,乘坐交通工具,拿钥匙开门。我们可以把这个下班回家封装成一个高层接口,对外隐藏下班回家过程中的子动作(打开,乘坐工具,开门)。又比如,模块化编程中,对客户提供一个初始化接口Init(),然后该Init()接口里去做N个模块的初始原创 2017-07-06 19:14:31 · 322 阅读 · 0 评论 -
包装模式之代理模式C++实现
#include class TrueObject;class TrueObject{public: int do_something(int a) { std::cout<<"TrueObject a="<< a << std::endl; return 0; }};class Proxy{public: Proxy() { m_Ture原创 2017-07-04 20:44:13 · 352 阅读 · 0 评论 -
Linux stat函数获取文件属性(文件大小,创建时间等,判断普通文件或者目录等)
struct stat64 s;memset(&s, 0, sizeof(struct stat64));nRet = stat64(pchFilename, &s);if (nRet){SK_ERROR(("stat %s failed! error_code: %s", pchFilename, strerror(errno)));return SK_FAILE原创 2017-01-01 19:12:51 · 18294 阅读 · 0 评论 -
使用epoll模型
epoll模型可以说是select模型和poll模型的升级版,但epoll要求在linux内核版本2.6以上。相对于,select和poll来说,epoll更加灵活,没有描述符限制。相比于select和poll,epoll不会因为监听的描述符数目变多而导致轮询过多(耗时太多),不会因为fd的数目增大而降低响应效率。 另外,对于select的最大描述符,linux会有限制,在linux/原创 2017-07-29 19:46:09 · 430 阅读 · 0 评论 -
观察者模式C++实现
观察者模式是一个应用非常广的模式之一,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。当一个对象发生了变化,关注它的对象就会得到通知;这种交互也称为发布-订阅(publish-subscribe)。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者。 比如发布者(电子杂志),订阅者有张三、张四、张五,这几个人就是观察者。发原创 2017-07-08 12:58:07 · 4561 阅读 · 0 评论 -
select的使用及缺陷
使用select多路复用模型,可以显著提高服务器的处理能力。select可以指定关心的描述符集以及关心这些描述符事件(可读、可写、异常),愿意等多久。 select函数的原型 /* According to POSIX.1-2001 */ #include /* According to earlier standar原创 2017-07-21 09:00:30 · 4082 阅读 · 0 评论 -
查找(一)史上最简单清晰的红黑树讲解
http://blog.csdn.net/yang_yulei/article/details/26066409查找(一)我们使用符号表这个词来描述一张抽象的表格,我们会将信息(值)存储在其中,然后按照指定的键来搜索并获取这些信息。键和值的具体意义取决于不同的应用。符号表中可能会保存很多键和很多信息,因此实现一张高效的符号表也是一项很有挑战性的任转载 2017-07-08 23:27:16 · 296 阅读 · 0 评论 -
轻松搞定面试中的红黑树问题
版权所有,转载请注明出处,谢谢!http://blog.csdn.net/silangquan/article/details/18655795 连续两次面试都问到了红黑树,关键两次都没有答好,这次就完整地来学习整理一下。没有学习过红黑树的同学请参考:> Chapter 13 Red-Black Trees Chapter 14 Augmenting转载 2017-07-08 23:34:13 · 276 阅读 · 0 评论 -
C++类的静态变量成员和静态成员函数的使用
1 类的静态成员变量当类的一个成员变量被声明为static类型时,该成员变量就是类的静态变量,属于类的所有实例。也就是说类的静态变量是类的所有该类实例的全局变量。 静态成员变量的初始化,与其他变量的初始化很不一样,静态成员需要在类外初始化,形式如下: 静态变量的类型> 类名> :: 类的静态成员变量名> 初始化值> 比如类Animal有私有静态成员st原创 2017-07-13 20:58:41 · 8562 阅读 · 2 评论 -
字节序大端和小端的理解
根据处理器的不同,字节序分为大端和小端。所谓大端,就是高字节的数据存放在低地址的内存地址,低字节的数据存放在高地址的内存地址。所谓小端,就是高字节的数据存放在高地址的内存地址,低字节的数据存放在低地址的内存地址。 大端如图示例:小端如图示例:如何写一个C语言程序识别目前机器是大端还是小端?#include原创 2017-07-13 20:51:27 · 480 阅读 · 0 评论 -
C++同名函数访问规则
#include class Base{public: virtual int start() { std::cout<<"Base start"<<std::endl; } int middle() { std::cout<<"Base middle"<<std::endl; } virtual int end() { std::cout<<"Base原创 2017-07-02 00:33:31 · 3311 阅读 · 0 评论 -
memmove的用法及实现
-bash-3.2$ man memmoveMEMMOVE(3) Linux Programmer’s Manual MEMMOVE(3)NAME memmove - copy memory areaSYNOPSIS #include void *me原创 2017-07-06 19:44:51 · 13149 阅读 · 4 评论 -
单例模式C++实现
单例模式,即只有一个实例。通常是一般的嵌入式设备或者要求占内存低的C++软件程序需要的模式。常见的单例实现#include class Single{public: static Single * GetInstance();private: Single(); ~Single(); Single(const Single &); const Si原创 2017-07-02 18:33:33 · 257 阅读 · 0 评论 -
工厂模式C++实现
工厂模式,主要是定义一个抽象类,在抽象类中定义纯虚函数,然后在派生类中,将实现虚函数。比如说,一个系统,需要把系统的各个模块启动或者分别销毁了,每个模块都有一个create函数和destroy函数。定义抽象基类,所有模块继承这个抽象基类,然后使用抽象基类指针指向这些模块的派生类对象,一一调用create,或者一一调用destroy。实现了动态绑定,好处就是方便扩展。原创 2017-07-02 20:16:34 · 1384 阅读 · 0 评论 -
gdb可以用于分析core文件
gdb可以用于分析core文件。产生core的原因一般是1.内存访问越界,错误的数组下标,字符串越界,2。多线程下使用线程不安全的函数3.多线程共享数据不加锁保护。4.非法指针。5堆栈溢出。特别是不能使用过大的局部变量,容易早成栈溢出。root@ubuntu:~# ulimit -c0 可以查看原创 2017-04-14 19:02:15 · 2465 阅读 · 0 评论 -
关于c++显示调用析构函数的陷阱
http://www.cnblogs.com/zsq1993/p/5838034.html关于c++显示调用析构函数的陷阱版权声明:欢迎转载,注明出处就好!如果不喜欢请留言说明原因再踩哦,谢谢,我也可以知道原因,不断进步!! 目录(?)[+] 一、文章来由现在在写一个项目,需要用到多叉树存储结构,但是在某个时候,我需要销毁这棵树,这意转载 2017-07-12 22:29:16 · 3934 阅读 · 1 评论 -
进程间的消息队列及msgtype的用法
Client.c#include #include #include #include #include #include #include #include #include extern int errno;#define ClientKey 1234static int gs_nClientMsgid = -1; typedef struct st原创 2017-06-06 23:48:38 · 8480 阅读 · 0 评论 -
浅拷贝类型的危险构造函数
(1)浅拷贝比如定义一个Book类,执行Book bookA;Book bookB(bookA)或Book bookB = bookA 如果没有实现拷贝构造函数,将会使用系统默认的拷贝构造函数,而系统默认生成的拷贝构造函数属于浅拷贝,当存在指针时,拷贝的仅仅是指针的地址,拷贝后,两个对象指向的内存地址相同,当其中一个对象销毁执行析构函数时,另外的一个对象的指针变成了迷途原创 2017-07-12 22:18:47 · 299 阅读 · 0 评论 -
C++ vector的初始化、添加、遍历、插入、删除、查找、排序、释放操作
C++的vector本质上是一个动态数组,数据量不大的情况下,非常方便存储和访问操作,当然,不好的情况是数据量大的情况下,查找效率低,删除操作还会导致大量的数组移动操作。虽然这样,vector还是一个很有用的东西,可以满足很多开发需求。 1. vector的初始化Vector是向量模板,C++ STL之一。前面说过vector是一个动态生长的数组,一开始vector为空时,会给一原创 2017-07-10 21:17:38 · 92240 阅读 · 0 评论 -
C++多态为什么要定义虚析构函数
请看父类Base类没有定义虚析构函数的例子:#include class Base{public: virtual int start() { std::cout<<"Base::start"<<std::endl; } ~Base() { std::cout<<"Base::~Base() "<<std::endl; }};class Derived : p原创 2017-07-13 20:47:43 · 495 阅读 · 0 评论 -
Linux C/C++ 多线程死锁的gdb调试方法
死锁的原因就不多说了,本质上,就是有一些线程在请求锁的时候,永远也请求不到。 先把有死锁的多线程代码贴出来#include #include #include #include #include pthread_mutex_t g_smutex ; void * func(void *arg){ int i=0; //lock pthread_mut原创 2017-07-31 11:14:29 · 8361 阅读 · 0 评论 -
网络套接字编程基本api
网络层的IP可以惟一标识网络中的主机,而传输层的协议、端口这两个东西可以表示主机中的进程(也就是网络应用程序)。因此,通过IP、协议、端口号,可以标识网络的进程。 先说服务器这边吧(1)服务器根据地址的类型(属于ipv4还是ipv6等)、socket类型(比如TCP、UDP)去创建socket,创建出的套接字socket本质上也是个文件描述符。(2)服务器绑定IP地原创 2017-07-19 08:13:42 · 2693 阅读 · 0 评论 -
如何给有死锁的进程发送信号,让他产生core文件
当然就是没有死锁也可以发信号让他产生core文件 1 首先来了解信号 Signal Description Signal number on Linux x86[1] SIGABRT Process aborted 6 SIGALRM Signal raised by alarm 14 SIGBUS Bus error: "access to undefined原创 2017-08-01 15:20:47 · 2694 阅读 · 0 评论 -
C++ STL list的初始化、添加、遍历、插入、删除、查找、排序、释放
list是C++标准模版库(STL,Standard Template Library)中的部分内容。实际上,list容器就是一个双向链表,可以高效地进行插入删除元素。使用list容器之前必须加上STL的list容器的头文件:#include; list属于std命名域的内容,因此需要通过命名限定:using std::list;也可以直接使用全局的命名空间方式:using nam原创 2017-08-20 14:31:28 · 163243 阅读 · 6 评论 -
使用select实现多线程定时器
#include #include #include #include #include #include #include #include int set_timer_s(long u32Time){ struct timeval stuTime; int ret = 0; memset(&stuTime, 0, sizeof(struct原创 2017-08-20 19:21:08 · 3942 阅读 · 0 评论 -
实现自己的日志函数,非常简单。
log.h#ifndef log_H_#define log_H_#include int logInit();int logPrintTime();#ifndef LOG_TRACE#define LOG_TRACE printf#define LOG_INFO(msg) \ do{ \ logPrintTime();\ LOG_TRACE msg;原创 2017-06-10 16:29:13 · 683 阅读 · 0 评论 -
C++11实现生产者和消费者
#include #include #include #include #include #include #include class CThreadMsg{private: std::deque m_data; std::mutex m_mtx; // 全局互斥锁. std::condition_variable m_cv; // 全局条件变量. int原创 2017-09-06 14:22:33 · 888 阅读 · 0 评论 -
C++11 thread编程调用类方法并传入参数
#include #include class classA{public : classA() { std::cout<<" classA " <<std::endl; } void func(int a, const char *pchText) { std::cout<<" func " <<std::endl; m_a = a;原创 2017-08-31 10:21:12 · 4895 阅读 · 0 评论 -
linux usleep函数参数溢出(睡眠多少微秒)
usleep函数的参数类型为unsigned inthttps://linux.die.net/man/3/usleep(1)usleep((0xffffff*1000));(2) usleep((0xffffffff));#include #include #include #include #include原创 2016-12-26 13:45:55 · 3880 阅读 · 0 评论 -
给snprintf函数弄个动态的格式串
先上代码:#include <stdio.h>int main(){ char chBuf[40] = {0}; char chParam[24] = {0}; snprintf(chParam, sizeof(chParam), "%%0%dd",4); snprintf(chBuf , sizeof(chBuf), chParam, 6); printf("---...原创 2018-03-26 23:37:44 · 606 阅读 · 0 评论 -
C++ strftime和std::get_time对linux struct tm的作用
代码说明一切。strftime给 struct tm结构体的日期的年+1900,月份+1,并按格式转成字符串std::get_time则对字符串获取struct tm结构体,年份-1900,月份-1代码如下:#include <iostream>#include <stdio.h>#include <time.h>#include &l...原创 2018-10-18 20:39:48 · 2731 阅读 · 0 评论 -
使用C++把字符串写入文件
#include <fstream> #include <iostream>#include <string>int write_string_to_file_append(const std::string & file_string, const std::string str ){ std::ofstream OsWrite(file...原创 2017-09-04 19:09:54 · 29560 阅读 · 9 评论 -
结构体中运算符的重载
C++中,结构体是无法进行==,>,=,比如二分查找,binary_crearch只能对数组进行查找,如果是结构体数组的话,它会报错。但很可惜,实际编程中,大部分时候操作对象是结构体数组。二分查找结构体数组的程序如下:[cpp] view plain copy#include #include #include转载 2017-08-20 14:12:08 · 7174 阅读 · 0 评论 -
HTTP POST方法的学习
在POST方法下,CGI程序可以直接从服务器的标准输入中获取数据,不过要先从CONTENT_LENGTH这个环境变量中得到POST参数的长度,然后再读取相应长度的内容。先弄个post.html,并放到htdocs目录下。CGI POSTMethod:POOSTPlease input two number:*=代码如下:#inclu原创 2017-08-19 13:56:25 · 1805 阅读 · 0 评论 -
HTTP GET参数的获取
REQUEST_METHOD的值一般包括POST和GET两种GET参数的获取在GET方法下,CGI程序无法直接从服务器的标准输入中获取数据,因为服务器把从标准输入接收到的数据编码到环境变量QUERY_STRING(或PATH_INFO),采用GET方法时,只需把这些数据附加到URL的末尾,如http://192.168.1.211:8080/cgi-bin/222?s=1&b=3&u=0,原创 2017-08-17 21:36:25 · 2993 阅读 · 0 评论 -
linux poll函数的使用
在网络编程中,Linux的poll函数跟select一样,可以处理多路复用。可以通过设置关注的描述符事件,灵活等待事件的到来。 #include int poll(struct pollfd *fds, nfds_t nfds, int timeout); (1)参数fds是pollfd结构体指针,可以指向一个结构体数组 struc原创 2017-07-22 21:49:49 · 12712 阅读 · 0 评论