c++
daydayup
this is a good boy
展开
-
C++使用宏定义单例模式
声明宏:#define PATTERN_SINGLETON_DECLARE(classname) \static classname * instance(); \static CMutex s_singletion_mutex;实现宏:#define PATTERN_SINGLETON_IMPLEMENT(classname) \CMutex classname::s_sing原创 2015-04-22 16:59:04 · 1838 阅读 · 0 评论 -
C++ 虚函数表解析
前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。 关于虚函数的使转载 2015-06-30 16:40:59 · 367 阅读 · 0 评论 -
C++头文件
一、C++编译模式通常,在一个C++程序中,只包含两类文件——.cpp文件和.h文件。其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码;而.h文件则被称作C++头文件,里面放的也是C++的源代码。C+ +语言支持“分别编译”(separate compilation)。也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的.cpp文件里。.cpp文件里的东西都是转载 2015-05-25 14:35:29 · 399 阅读 · 0 评论 -
提高程序运行效率的10个简单方法
对于每一个程序员来说,程序的运行效率都是一个值得重视,并为之付出努力的问题。但是程序性能的优化也是一门复杂的学问,需要很多的知识,然而并不是每个程序员都具备这样的知识,而且论述如何优化程序提高程序运行效率的书籍也很少。但是这并不等于我们可以忽略程序的运行效率,下面就介绍一下本人积累的一些简单实用的提高程序运行效率的方法,希望对大家有所帮助。注:以C/C++程序为例转载 2015-05-26 14:17:27 · 1135 阅读 · 0 评论 -
C++关于类成员函数指针的正确写法
关于类成员函数指针的正确写法10-09Web开发 Dante 10,735一般来说,函数指针的用法是比较简单的。 比如对于函数: int innerFunc(int num);1intinnerFunc(intnum);可以使用:int (*ptrFunc)(in转载 2015-05-26 16:02:52 · 2743 阅读 · 0 评论 -
C++为什么要用bool类型
1.1. 为什么要用bool类型、因为我曾经看到过C++程序员,使用着C++的编译器,却仍然在使用BOOL、TRUE、FALSE等宏来表达现实世界中的二值事物,令我很不解,前去询问才知是“习惯”。显然,它以前是使用C语言编程的,而且使用这些宏做了很多事,也从来没有感觉到不好,为什么要用内置的bool类型呢,至少有两个优点,下面分别讨论。1.1.1. 提高程序的可读性Boolean(布转载 2015-07-01 18:10:00 · 2769 阅读 · 0 评论 -
C++中的namespace
namespace中文意思是命名空间或者叫名字空间,传统的C++只有一个全局的namespace,但是由于现在的程序的规模越来越大,程序的分工越来越细,全局作用域变得越来越拥挤,每个人都可能使用相同的名字来实现不同的库,于是程序员在合并程序的时候就会可能出现名字的冲突。namespace引入了复杂性,解决了这个问题。namespace允许像类,对象,函数聚集在一个名字下。本质上讲namespace转载 2015-07-17 14:57:07 · 376 阅读 · 0 评论 -
正确使用#include和前置声明(forward declaration)
差不多一年时间没用过C++写过程序了,由于工作的需要,我又回到了C++的阵形。在工作的过程中遇到了很多麻烦,当我往工程里加一个类,而且那个类又与工程里的类相关,如有那个类型的成员变量。情况如下//////A.h///////////class A{.......};////////B.h//////////class B:A{....A member;}转载 2015-07-22 14:09:32 · 519 阅读 · 0 评论 -
c、c++引用
C的引用:#include void ex(int* x,int* y){ int* ptr=x; x=y; y=ptr; printf("*x=%d,*y=%d\n",*x,*y);}int main(void){ int x=5; int y=10; ex(&x,原创 2015-08-08 14:13:38 · 311 阅读 · 0 评论 -
代码中特殊的注释技术——TODO、FIXME和XXX的用处
本文内容概要: 代码中特殊的注释技术——TODO、FIXME和XXX的用处。 前言:今天在阅读Qt Creator的源代码时,发现一些注释中有FIXME英文单词,用英文词典居然查不到其意义!实际上,在阅读一些开源代码时,我们常会碰到诸如:TODO、FIXME和XXX的单词,它们是有其特殊含义的。、TODO: + 说明:如果代码中有该标识,说明在标识处有功能代码待编写,转载 2015-09-16 22:17:56 · 293 阅读 · 0 评论 -
gcc中动态库和静态库的链接顺序
so文件:动态库a文件: 静态库exe文件:可执行程序(linux下以文件属性来标示是否是可执行文件,与后缀名无关)经过自己写的一些测试程序,大致了解了下gcc中链接顺序问题,总结出以下几点:1,动态库中可以包含另一个静态库,通过参数 -lxxx 把静态库libxxx.a加入so文件中,这样so文件中 就包含了libxxx.a的所有实现。当然,如果不包含libxxx.a转载 2015-09-19 10:50:25 · 4582 阅读 · 1 评论 -
c++对象内存布局
c++对象内存布局一直不明白c++中类中的函数和成员变量在实例化对象后在内存中究竟是个什么样的布局。一度以为一个对象的内存布局应该包括函数体和成员变量,后来才知道对象的内存布局是不包括函数体的。也就是说实例化一个类后,该对象占用的内存空间大小实际上是它的成员变量在内存中所占用空间大小(注意,含有静态成员变量和虚函数的类对象例外)。以下分析以下c++类对象在内存中的布局,并且探讨在给定一个类的成转载 2015-09-21 18:08:05 · 521 阅读 · 1 评论 -
TLV 格式及编解码示例
TLV是一种可变格式,意思就是:Type类型, Lenght长度,Value值;Type和Length的长度固定,一般那是2、4个字节(这里统一采用4个字节);Value的长度有Length指定;编码方法:1. 将类型type用htonl转换为网络字节顺序,指针偏移+42. 将长度length用htonl转换为网络字节顺序,指针偏移+43.转载 2015-09-21 17:57:28 · 2589 阅读 · 0 评论 -
C++三种容器:list、vector和deque的区别
在写C++程序的时候会发现STL是一个不错的东西,减少了代码量,使代码的复用率大大提高,减轻了程序猿的负担。还有一个就是容器,你会发现要是自己写一个链表、队列,或者是数组的时候,既要花时间还要操心怎么去维护,里面的指针啊,内存够不够用啊,长度问题,有没有可能溢出啊等等一系列的问题等着我们去解决,还是比较头疼的。所以容器的出现解决了这一个问题,它将这些数据结构都封装成了一个类,只需要加上头文件,我...转载 2018-03-13 20:31:39 · 297 阅读 · 0 评论 -
extern "C"的用法解析
1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有转载 2015-07-01 09:35:38 · 289 阅读 · 0 评论 -
linux中memset的正确用法
【起因】希望对各种类型的数组进行初始化,避免野值 【函数头文件】 提示:在linux中可以在terminal中输入 "man memset"进行查询 #include void *memset(void *s, int c, size_t n); 【使用说明】 The memset() function fills转载 2015-06-29 14:19:44 · 8100 阅读 · 0 评论 -
c++中使用include和直接写class类名的区别
在写 头文件的时间 经常会有一些 class QFile 等这类 看似 是声明的东西..例如下面#ifndef WINDOW_H#define WINDOW_HQT_BEGIN_NAMESPACEclass QTcpServer;class QTcpSocket;class QProgressBar;class QLabel;class QDialo转载 2015-04-22 16:43:19 · 877 阅读 · 0 评论 -
UML中几种类图的定义和表示
我们知道,面向对象的特性就是封装、继承和多态,而为了使这些关系呈现的更加清晰,经常采用UML类图的形式来表示。常见的几种关系如下:1. 类(Class): 表示对某种对象的封装。具体表示如下图, 最上面一格代表类名,斜体表示该类为抽象类;第二格表示该类的特性,就是常说的字段和属性;第三格表示类的操作,即方法和行为。前面的+号表示public,-表示private,#表示prot转载 2015-04-23 10:28:23 · 1555 阅读 · 0 评论 -
C++ explicit关键字应用方法详解
C++编程语言中有很多比较重要的关键字在实际编程中起着非常重要的作用。我们今天为大家介绍的C++ explicit关键字就是其中一个应用比较频繁的关键字。下面就让我们一起来看看这方面的知识吧。C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?如果c++类的构造函数有一个参数,那么在编译的时候就会转载 2015-04-23 20:36:41 · 428 阅读 · 0 评论 -
浅析静态库链接原理
静态库的链接基本上同链接目标文件.obj/.o相同,但也有些不同的地方。本文简要描述linux下静态库在链接过程中的一些细节。静态库文件格式静态库远远不同于动态库,不涉及到符号重定位之类的问题。静态库本质上只是将一堆目标文件进行打包而已。静态库没有标准,不同的linux下都会有些细微的差别。大致的格式wiki上描述的较清楚:Global header-----------------转载 2015-04-13 14:46:38 · 431 阅读 · 0 评论 -
C++中的单例模式
单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。有很多地方需要这样的功能模块,如系统的日志输出,GUI应用必须是单鼠标,MODEM的联接需要一条且只需要一条电话线,操作系统只能有一个窗口管理器,一台PC连一个键盘。 单例模式有许多种实现方法,在C++中,甚至可以直接用一个全局变量做转载 2015-04-20 14:01:28 · 429 阅读 · 0 评论 -
c++学习指南
在31年前(1979年),一名刚获得博士学位的研究员,为了开发一个软件项目发明了一门新编程语言,该研究员名为Bjarne Stroustrup,该门语言则命名为——C with classes,四年后改称为C++。C++是一门通用编程语言,支持多种编程范式,包括过程式、面向对象(object-oriented programming, OP)、泛型(generic programming, GP)转载 2015-04-24 09:53:47 · 1021 阅读 · 0 评论 -
c++与lua相互调用
一. lua调用C++ 在lua中是以函数指针的形式调用函数, 并且所有的函数指针都必须满足如下此种类型:typedef int (*lua_CFunction) (lua_State *L); 也就是说, 偶们在C++中定义函数时必须以lua_State为参数, 以int为返回值才能被Lua所调用. 但是不要忘记了, 偶们的lua_State是支持栈的, 所以通过栈可转载 2015-04-20 19:50:48 · 498 阅读 · 0 评论 -
C++模板详解
C++模板 模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。 模板是一种对类型进行参数化的工具; 通常有两种形式:函数模板和类模板; 函数模板针对仅参数类型不同的函数; 类模板针对仅数据成员和成员函数类型不同的类。 使用模板的目的就是能够让程序员编写与类型无关的代转载 2015-04-25 15:57:03 · 279 阅读 · 0 评论 -
C++成员函数作用域问题
1.原题如下:问题是当p离开作用域时,不是应该p变成野指针么,为什么test函数输出依然正确?12345678910111213141516171819#include usingnamespace std;classA{ public: vi转载 2015-05-20 14:26:25 · 523 阅读 · 0 评论 -
C++面向对象程序设计中怎么判断一个对象的类类型
C++面向对象程序设计中如何判断一个对象的类类型 在C++面向对象程序设计中,有时候需要判断某个对象的类类型,那么可以有下列两种方法: 方法1: 采用 typeid()函数进行判断:(缺点:当存在继承,并且子类指针赋值给父类指针时,此时判断的对象类型为父类型,而不是子类类型) 对于一个父类CFather,其有两个子类CChildOne,CChildTwo。那么如何判断一个对象的类转载 2015-05-21 10:34:44 · 7089 阅读 · 0 评论 -
C++子类访问父类protected成员
#include class A{ public: A(){} ~A(){} protected: int m;};class B:public A{ public: B(){} ~B(){}};cl原创 2015-05-28 20:15:22 · 11642 阅读 · 0 评论 -
const char*, char const*, char*const的区别
const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目。 事实上这个概念谁都有,只是三种声明方式非常相似很容易记混。 Bjarne在他的The C++ Programming Language里面给出过一个助记的方法: 把一个声明从右向左读。 char * const cp; ( * 读成 pointer to转载 2015-06-25 11:37:25 · 301 阅读 · 0 评论 -
c/c++数组初始化误区
char szTmp[256] = {0};char szTmp2[256] = {1};一开始总认为szTmp的值就全部是0,szTmp2的值全部是1.结果打印一看,szTmp的值就全部是0,但是szTmp2的第一个值是1,其他的全部是0原因: int szTmp[256]={var}; 第一个元素是显式地初始化为var,其余元素是隐式地初始化为0。在这里顺便再跟大家一起温习转载 2015-06-29 13:50:53 · 1891 阅读 · 0 评论 -
C++中临时对象及返回值优化
了解临时对象的来源什么是临时对象? C++真正的临时对象是不可见的匿名对象,不会出现在你的源码中,但是程序在运行时确实生成了这样的对象.通常出现在以下两种情况:(1)为了使函数调用成功而进行隐式类型转换的时候。 传递某对象给一个函数,而其类型与函数的形参类型不同时,如果可以通过隐式转化的话可以使函数调用成功,那么此时会通过构造函数生成一个临时对象...转载 2018-08-24 11:41:00 · 397 阅读 · 0 评论