随笔分类 - C++
摘要:引用是可以作为类的成员变量的。 引用类型成员变量的初始化: 1,不能直接在构造函数里初始化,必须用到初始化列表,且形参也必须是引用类型。 2,凡是有引用类型的成员变量的类,不能有缺省构造函数。原因是引用类型的成员变量必须在类构造时进行初始化。3,如果两个类要对第三个类的数据进行共享处理,可以考虑把第三个类作为这两个类的引用类型的成员变量。
阅读全文
摘要:自定义调试信息的输出 调试信息的输出方法有很多种, 例如直接用printf, 或者出错时使用perror, fprintf等将信息直接打印到终端上, 在Qt上面一般使用qDebug,而守护进程则一般是使用syslog将调试信息输出到日志文件中等等... 使用标准的方法打印调试信息有时候不是很方便,
阅读全文
摘要:可以使用无用参数占位 RecvMsg(Msg */*pMsg*/) 在出现头文件循环包含时,偶尔也会用到先声明再包含头文件的方式.
阅读全文
摘要:取得std::ostringstream里的内容可以通过str()和str(string&)成员函数。由于str()返回的是临时对象,因而会有如下误用:constchar* pBuffer = oss.str().c_str(); pBuffer指向的内存已被析够! 测试代码:ostringstream oss; oss <<" something you like "<< endl; // can't work! constchar* szData1 = oss.str().c_str(); // work! std::string
阅读全文
摘要:在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题。这是就可能用到htons(), ntohl(), ntohs(),htons()这4个函数。网络字节顺序与本地字节顺序之间的转换函数:htonl()--"Host to Network Long"ntohl()--"Network to Host Long"htons()--"Host to Network Short"ntohs()--"Network to Host Short"之所以需要这些函数是因为计算机数据表示存在两种字节顺序:NBO
阅读全文
摘要:这里说的是手工配置,假设我的pclin.exe在 d:pclint8目录下面,所有的*.lnt文件在d:pclint8lnt目录下面:1. options->custom commandsa) 添加一个新的命令名,例如:Pc Lint b) 在run 中填入:d:pclint8lint -u -ic:lint std env-si %fd:pclint8是你的Pclint所在的目录.c) 在path中填入:d:PCLint8lnt(就是你所有*.lnt文件所在的目录)d) 勾选下面的选项: Iconic WindowCapture OutputSave Files FirstParse
阅读全文
摘要:template<class T>void func1(T &, T &) {}template<class TT>void func2(TT, TT) {}int main(){ int a[10], b[10], c[20]; func1(a, b); //OK, 数组引用 func1(b, c); //ERROR,形参为引用时, 数组不能转换为指针, //b,c类型(数组长度)不匹配,参考C++ Primer P538 func2(a, b); //OK,作为数组指针 func2(b, c); //OK,作为数组指针 return 0;}1 .在C
阅读全文
摘要:C++中变量生存期与VB中大不相同,C++中非静态局部变量的生存周期仅限于其声明所在的块(即程序中对应的大括弧)中,在退出块时便会释放掉内存。例:class destruct{public: int mem; destruct() { mem = 0; } ~destruct() { mem++; }};void main(){ int * pa = NULL; { destruct odestruct; } if (true) { int a = 10; pa = &a; } for (int i = 0; i < 10; i++) { i++; } (*pa)++; cout
阅读全文
摘要:#include "stdafx.h"#include <iostream>using namespace std;int globalJ =999;//返回值int test1(){ int j =1; cout<<"in test1(),[return value] the varaible j's address :"<<&j<<endl; return j;}//使用局部变量,返回引用int& test2(){int j =998;cout<<"in t
阅读全文
摘要:所有的标准库容器都定义了相应的迭代器类型。迭代器对所有的容器都适用,现代 C++ 程序更倾向于使用迭代器而不是下标操作访问容器元素。1.iterator,const_iterator作用:遍历容器内的元素,并访问这些元素的值。iterator可以改元素值,但const_iterator不可改。跟C的指针有点像(容器均可以++iter,而vector还可以iter-n, iter+n,n为一整型,iter1-iter2:结果是difference_type类型,表两元素的距离.)2.const_iterator 对象可以用于const vector 或非 const vector,它自身的值可以
阅读全文
摘要:2009/07/13 17:10 wanghaining 阅读 : 81 评论 : 0 推荐 : 0 抓走 : 0 http://www.oobang.com/myNote/310 复制链接 RSS来源 : 译言-每日精品译文推荐 | imqiang 去看原文章 译者:imqiang 当使用结构对象作为哈希表的键时,哈希表的查找操作的性能糟透了。这要“归功于”内部所使用的用来查找的方法G...
阅读全文
摘要:类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时,静态数据成员还具有以下特点:1.C++静态数据成员的定义。 静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中。其定义方式与全局变量相同。举例如下:xxx.h文件 1. ...
阅读全文
摘要:vector: 向量容器,使用线性存储结构,可以像数组一样随机(下标)访问元素,还可以在尾部插入元素(用push_back()函数)。特点:访问元素速度快,但插入、删除操作速度慢;list: 双向链表容器,数据元素是通过链表指针串连成逻辑意义上的线性表,但在物理内存中数据可以是不连续的。特点:对链表的任一位置的元素进行插入、删除和查找操作都是极快速的,但由于通过指针串连而成(这里的指针也占用了内存空间),不能通过下标访问元素,因此list容器访问元素的速度比vector慢;deque: 双端队列容器,跟vector一样和采用线性表存储结构,但与vector唯一不同的是,deque采用分块的线性
阅读全文
摘要:STL map和set的使用虽不复杂,但也有一些不易理解的地方,如: 为何map和set的插入删除效率比用其他序列容器高? 为何每次insert之后,以前保存的iterator不会失效? 为何map和set不能像vector一样有个reserve函数来预分配数据? 当数据元素增多时(10000到20000个比较),map和set的插入和搜索速度变化如何?或许有得人能回答出来大概原因,但要彻底明白,还需要了解STL的底层数据结构。C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和
阅读全文
摘要:C++的标准模板库(Standard Template Library,简称STL)是一个容器和算法的类库。容器往往包含同一类型的数据。STL中比较常用的容器是vector,set和map,比较常用的算法有Sort等。 . 一. vector 1.声明: 一个vector类似于一个动态的一维数组。 vector a; //声明一个元素为int类型的vector a vectot a; //声明一个元素为MyType类型的vector a 这里的声明的a包含0个元素,既a.size()的值为0,但它是动态的,其大小会随着数据的插入 和删除改变而改变。 vector a(100, 0); //这里
阅读全文
摘要:友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。问题的提出 我们已知道类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。 为了解决上述问题,提出一种使用友元的方案。友元是一种定义在类外部的普通函数或类,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字fr..
阅读全文
摘要:突然有人问起C++继承,一段时间不用就忘记了,所以记下来.而且也看到都不知道的一些新鲜东西.工作后一直是public,所以一直以为类的继承是默认公有继承的,而且认为这样子更加合理,不过今天看到原来默认是私有继承的,想想也又有它的合理性,因为与结构体相比较,类更加强调封装,而结构体更加强调其内部组织结构,所以涉及到类的一些默认状态往往趋向于有利于封装,而结构体则相反.通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。目录C++继
阅读全文
摘要:WINDOWS的钩子函数可以认为是WINDOWS的主要特性之一。利用它们,您可以捕捉您自己进程或其它进程发生的事件。通过“钩挂”,您可以给 WINDOWS一个处理或过滤事件的回调函数,该函数也叫做“钩子函数”,当每次发生您感兴趣的事件时,WINDOWS都将调用该函数。一共有两种类型的钩子:局部的和远程的。 局部钩子仅钩挂您自己进程的事件。远程钩子还可以将钩挂其它进程发生的事件。远程的钩子又有两种: 基于线程的 它将捕获其它进程中某一特定线程的事件。简言之,就是可以用来观察其它进程中的某一特定线程将发生的事件。 系统范围的 将捕捉系统中所有进程将发生的事件消息。
阅读全文
摘要:读这本书,感觉非常有用.只是有些公用的规则就不一一列举,只记下自己以前不是那么清楚地规则. 代码质量保证优先原则: (1)正确性,指程序要实现设计要求的功能。 (2)稳定性、安全性,指程序稳定、可靠、安全。 (3)可测试性,指程序要具有良好的可测试性。 (4)规范/可读性,指程序书写风格、命...
阅读全文
摘要:堆与栈比较1.管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。2.空间大小:一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的,例如,在VC6下面,默认的栈空间大小是1M(好像是,记不清楚了)。当然,我们可以修改: 打开工程,依次操作菜单如下:Project->Setting->Link,在Category 中选中Output,然后在Reserve中设定堆栈的最大值和commit。注意:reserve最小值为4Byte;c
阅读全文