cpp
文章平均质量分 60
coderchenjingui
失眠爱好者!
展开
-
由rand()函数想到的
rand()函数,生成[n,m]之间随机数的方法是rand()%(m-n+1)+n。之前学习的时候,不知道为什么这个函数为什么这怪,也没仔细去想。只是感觉这个函数太难记了,以至于每次使用都得查。最近,一室友(简称TT)在用这个函数的时候也忘记怎么用了,于是我们商量了一下,终于觅得真章。首先rand()函数是生成[0,RAND_MAX]之间的随机数,而%表示取余,(m-n+1)表示一个间原创 2012-08-13 11:12:13 · 1061 阅读 · 1 评论 -
PIMPL
再说说libjingle这个库,看了N久了,还是没搞清楚流程。但是从libjingle的源码中学到了PIMPL的知识。假设现在有一个StuManager类,StuManager.h classStuManager { public: constint getAge() const; private: intage;原创 2013-01-11 19:08:58 · 1305 阅读 · 0 评论 -
动态多态与静态多态
多态的字面含义:具有多种不同的形态。关键字:重载/模版和虚函数类型:编译期多态(静态多态,早绑定)和运行期多态(晚绑定)编译期多态(重载/模版):重载int getMax(int param1,int param2);double getMax(double param1,double param2);模版:templateT getMax(T param1,T原创 2013-01-25 17:10:07 · 12618 阅读 · 3 评论 -
从一道题分析C++虚函数机制
问题:写出下面程序的运行结果:#include using std::cout;using std::endl;class A{public: void nonVirtualFun() { cout<<"1"<<endl; } virtual void virtualFun() { cout<<"2"<<endl; } virtual ~A(){}};原创 2013-01-26 22:54:52 · 1474 阅读 · 0 评论 -
if代码块中定义的变量的释放时机
class MutexLock{public: MutexLock() { InitializeCriticalSection(&mutex_); } ~MutexLock() { DeleteCriticalSection(&mutex_); } void lock() {原创 2013-01-14 14:44:17 · 1815 阅读 · 0 评论 -
虚函数与虚继承寻踪
非原创,摘自C++前辈(组员)ZMF。封装、继承、多态是面向对象语言的三大特性,熟悉C++的人对此应该不会有太多异议。C语言提供的struct,顶多算得上对数据的简单封装,而C++的引入把struct“升级”为class,使得面向对象的概念更加强大。继承机制解决了对象复用的问题,然而多重继承又会产生成员冲突的问题,虚继承在我看来更像是一种“不得已”的解决方案。多态让对象具有了运行时特性原创 2013-01-15 09:52:39 · 1430 阅读 · 1 评论 -
警惕C++令人恼怒的解析
假设C盘下文件C:\1.txt,里面存储的是一些int型数据,现在要把这些数据读入一个list中,或许我们就写出了下面的代码: std::ifstream infs("c:\1.txt"); std::listlistInt(std::istream_iterator(infs),std::istream_iterator());但这并没有按照预期原创 2013-01-17 21:05:08 · 3182 阅读 · 2 评论 -
函数对象(Function Objects)
函数对象简介函数对象,也叫仿函数,是一种实现了operator()的类型。STL使用函数对象用在一些算法上。函数对象比直接的函数调用提供了2方面的优点。1:函数对象可以包含自身的状态(因为是类类型,所以可以封装自身的状态/属性)。2:因为函数对象是一种类类型,所以可以用来实例化模版参数。创建函数对象为了创建一个函数对象,必须创建一个类,并实现operator()。例如:原创 2013-03-09 11:22:58 · 1268 阅读 · 0 评论 -
Lambda Expressions in C++
关于Lambda表达式许多编程语言提供了匿名函数,Lambda表达式是与匿名函数有关的编程方法。匿名函数就是一个只有函数实体,而没有函数名字的函数。Lambda表达式隐式的定义了一个函数对象类(有关函数对象简介),并且构造了一个该类的对象。可以把Lambda表达式看作是包含状态和可以访问封闭作用域外的变量的匿名函数。函数对象 VS Lambda表达式我们有时候会用函数指针和函数对象来解原创 2013-03-09 14:22:35 · 1389 阅读 · 0 评论 -
Lambda表达式语法
例子把斐波那契数列的前9个数存入vector容器。并输出。#include #include #include using namespace std;int main(){ const int elementNum=9; vector vecInt(elementNum,1); int x=1,y=1; generate_n(vecInt.begin()+2,ele原创 2013-03-09 16:04:04 · 2005 阅读 · 0 评论 -
do{...}while(0)
最近在读libevent源码的时候,发现好多do{...}while(0)类似的宏,百思不得其解,今天在逛博客园的时候,突然发现有位兄弟的博文解释了,如醍醐灌顶。原位地址:点击打开链接原创 2013-10-25 14:13:20 · 947 阅读 · 0 评论 -
traits编程技巧
最近在学习《STL源码剖析》,对书中介绍的traits很有感。搜到的前辈的博客,这篇博文写的很好,感谢。自己在写一下,加深自己的理解。举例:加入我们现在有一个算法,可以对传入的迭代器前进N步。template void move_n_step(ITERATOR &itor, int n){ for (int i = 0; i < n; i++) itor原创 2013-11-06 22:20:20 · 1230 阅读 · 0 评论 -
C++编译链接的那些小事
最近,有同事向我多次问及C++关于编译链接方面的问题,包括如下:1:什么样的函数以及变量可以定义在头文件中2:extern "C"的作用3:防止重复包含的宏的作用4:函数之间是怎么链接起来的我认为,这些问题不难,书上基本上都有,但要是没有真正思考过,就凭死记硬背,也就是只能“嘴上说说”而已,遇到问题还真棘手,所以我觉得有必要说一下。C/C++的编译链接过程其实,原创 2014-01-22 21:00:10 · 10447 阅读 · 4 评论 -
STL之traits技法
traits汉译为特性,形状,暂且知道这是于特性相关的就OK。後捷老师说“源码面前,了无秘密”,所以逼人打算直面晦涩的源码,一探究竟。现在,先来想象一个简单的场景,有一个函数advance(iterator,step),这个函数可以使迭代器iterator前进step个距离(step也可以为负),这里暂时不考虑step为负的情况。那么一个机器粗烈的实现可能是下面这样的templat原创 2014-01-01 10:28:40 · 1500 阅读 · 0 评论 -
C++预编译头文件
http://blog.csdn.net/btooth/article/details/980251许多初学 VC 的朋友也许都为那么一个问题困扰过: 为什么所有的 cpp 都必须 #include "stdafx.h" 也许请教了别的高手之后,他们会告诉你,这是预编译头,必须包含。可是,这到底是为什么呢?预编译头有什么用呢? 这得从头文件转载 2014-12-10 16:14:28 · 1303 阅读 · 0 评论 -
std::function与std::bind 函数指针
function模板类和bind模板函数,使用它们可以实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类 的非静态成员函数时。std::function可以绑定到全局函数/类静态成员函数(类静态成员函数与全局函数没有区别),如果要绑定到类的非静态成员函数,则需要使用std::bind。#include #include using namespace std;typ原创 2013-01-22 20:37:06 · 83130 阅读 · 7 评论 -
不要对用基类指针操作子类数组
#include using namespace std;class Base{public: virtual void show() { cout<<"base"<<endl; } virtual ~Base(){}};class Derived:public Base{public: virtual void show()原创 2012-12-17 20:54:54 · 1302 阅读 · 0 评论 -
类Test,定义对象时Test t()与Test t
VC6#include class Test{public: Test() { cout<<"Hello Test!"<<endl; }};int main(){ Test t(); return 0;}很简短的小程序,执行不会输出任何想要的东西。以前没注意到,今天遇到了,请教别人,得知。main中 Test t();被编译器误认为是一个函数声明,而不原创 2012-11-22 10:24:45 · 1670 阅读 · 0 评论 -
构造函数,拷贝构造函数,赋值操作符的调用时机
#include class TEST{public: TEST() { cout<<"默认构造函数"<<endl; } TEST(const TEST&t) { cout<<"拷贝构造函数"<<endl; } TEST &operator =(const TEST&t) { cout<<"赋值操作符"<<endl; return *this; }};原创 2012-08-15 14:59:15 · 1339 阅读 · 0 评论 -
extern char *a与extern char a[]
《C陷阱与缺陷》提到要特别注意extern char *a与extern char a[]之间的区别。所以特意测试了一下。测试环境VC6b.cppchar *a="ABCDEF";char b[]="ABCDEF";第一种情况:主文件中声明extern char a[];extern char b[];#include extern char a[]原创 2012-08-15 19:31:36 · 9756 阅读 · 5 评论 -
#include与寻找函数的实现
大一学C++的时候,死板的记着“头文件声明函数,源文件实现函数,其余文件如果要用这个函数的话,包含头文件即可”。虽然不知道为什么,但也没仔细想。后来仔细想想,略有所悟。大一时间就这样写程序:fun.hint myAdd(int,int);fun.cpp#include "fun.h"int myAdd(int a,int b){ return a+b;}原创 2012-08-16 14:19:27 · 1533 阅读 · 1 评论 -
类成员变量的赋值与初始化
C++规定:对象的成员变量的初始化动作发生在进入构造函数本体之前。#include #include using namespace std;class STU{public: /* name为初始化,sex和age为赋值 */ STU(string _name,string _sex,int _age):name(_name) { sex=_原创 2012-08-16 14:53:38 · 12201 阅读 · 0 评论 -
Qt4.8.2 模仿QQ右下角弹窗提示
今天在CSDN偶然看到一位前辈用JAVA写的QQ右下角弹窗提示,而自己正在学习Qt,所以也自己试着写一下,虽然代码乱的一塌糊涂,但最后还是能够运行了。程序最终运行:输入内容并点击确定的时候,从右下角平滑弹出下图。停留10秒后,逐渐变透明并最终消失,可自行关闭和点击浏览按钮浏览输入的网址。 一、输入内容的对话框从QDialog继承,点击确定,内容不为空时,作适原创 2012-08-17 18:41:07 · 8636 阅读 · 5 评论 -
《Effective C++》尽量以const,enum,inline,替换#define
在程序被编译器编译之前,宏会被预处理器执行文本替换,编译器或许根本看不到宏。例如 #define ASPECT_RADIO 1.653,如果因为此常量出现问题,编译器也许会提到1.653而不是ASPECT_RADIO。十分不利于分析调试。解决之道是以一个常量替换之const double AspectRadio=1.653。使用常量可能比使用宏产生更小的目标码。因为预处理器“盲目的将ASP原创 2012-08-16 09:37:06 · 963 阅读 · 0 评论 -
由Qt中qApp想到的(这是单例模式么???)
学Qt时,发现只要包含头文件QApplication或者QCoreapplication,就用使用qApp,指向一个当前实例。查看源码发现qApp是个宏:QApplication中:#define qApp (static_cast(QCoreApplication::instance()))QCoreapplication中:#define qApp QCoreApplication原创 2012-08-18 16:15:44 · 24212 阅读 · 6 评论 -
《Effective C++》不要在构造函数和析构函数中调用虚函数
#include class BASE { public: BASE() { myPrint(); } ~BASE() { myRelease(); } protected: virtual void myPrint(){cout<<"Base"<<endl;} virtual void myRelease(){cout<<"Base Rele原创 2012-08-25 09:37:24 · 2908 阅读 · 0 评论 -
《Effective C++》operator=返回*this的目的:实现连锁赋值
经常看到连锁赋值,如int x,y,z; x=y=z;如果不允许连锁赋值,就麻烦了。对于类来说,我们也希望可以连锁赋值。关键在于重载‘=’运算符的返回值。#include class TEST { public: TEST& operator=(const TEST& rhs){return *this;} }; void main() { TEST a,b,c原创 2012-08-25 10:03:02 · 1910 阅读 · 0 评论 -
vs2008下编译boost_1_47_0
1.下载boost库,并解压,我下载的 boost_1_47_0.zip,我解压到C盘。2.运行--cmd:输入 cd C:\boost_1_47_0,回车,转移到boost解压后的根目录3.运行bootstrap.bat,生成b2.exe4运行命令b2 --toolset=msvc-9.0 --build-type=complete等待30到60分钟,编译完成,提示信息如下。原创 2012-08-25 18:13:29 · 1259 阅读 · 0 评论 -
逗号表达式
首先从一个错误的操作写起,本来我要初始化一个数组。结果误写成这样的了:int a[3][2]={(0,1),(2,3),(4,5)};这样一来,a[0][0]=1,a[0][1]=3,a[1][0]=5,其余元素等于0。仔细查了下,这牵扯到两个问题。1.数组的初始化方法正确的初始化方法如下: int a[3][2]={{0,1},{2,3},{4,5}}; int a[原创 2012-09-28 17:18:49 · 2915 阅读 · 0 评论 -
交换两个数的三种方法
#include using namespace std;/*使用局部变量完成交换*/void swap1(int &a, int &b){ int temp=a; a=b; b=temp; }/*使用加减运算完成交换缺点:可能产生溢出*/void swap2(int &c,int &d){ c+=d; d=c-d;原创 2012-09-22 10:17:47 · 1106 阅读 · 0 评论 -
malloc/free与new/delete的区别
malloc/free是C的标准库函数,new/delete是C++的运算符。他们都可以用于动态申请和释放内存。对于非内部基本数据类型,malloc/free不能满足需求,因为其不会调用构造函数和析构函数。但是new/delete会调用相应的构造函数和析构函数。#include #include using namespace std; class TEST { public原创 2012-09-22 22:15:08 · 814 阅读 · 0 评论 -
字符串部分操作的函数实现
#include using namespace std;/*求sub字符串在src中匹配的位置,匹配失败返回-1*/int findStr(const char*src,const char*sub){ if(src==NULL || sub==NULL) return -1; const char * srcp; const char * subp原创 2012-09-24 18:37:16 · 822 阅读 · 0 评论 -
以对象管理资源 auto_ptr和shared_ptr
void doSomething(){ int *a=new int(100); /* ...... 如果此处的代码发生异常,doSomething()会提早返回,而delete也将不会执行,最终导致资源泄漏 */ delete a;}为了保证doSomething()中资源总是能够得以释放,我们将资源放入对象中,当控制流离开doSomething(),对象的析构函数自动释放资原创 2012-08-26 08:47:43 · 1150 阅读 · 0 评论 -
浅谈GCC预编译头技术
原文:http://blog.csdn.net/wallwind/article/details/7676019文/jorge——谨以此文,悼念我等待MinGW编译时逝去的那些时间。其 实刚开始编程的时候,我是丝毫不重视编译速度之类的问题的,原因很简单,因为那时我用BASICA。后来一直用到C++ Builder,尽管Borland的广告无时无刻不在吹嘘其编译速度,我却转载 2014-12-10 16:12:52 · 2767 阅读 · 1 评论