随笔分类 - C++
摘要:Remove_if的等效操作template < class ForwardIterator, class Predicate > ForwardIterator remove_if ( ForwardIterator first, ForwardIterator last, Predicate pred ){ ForwardIterator result = first; for ( ; first != last; ++first) if (!pred(*first)) *result++ = *first; return result;}删除vector中的数据vector能
阅读全文
摘要:好像没有什么数组常量吧。 普通数组引用 void function(int (&array)[5]) 研究发现,木有定义成功,常量数组是数组中每个成员不能被修改,那数组常量好像也应该是数组中每个成员不能被修改。举例:结构体常量数组struct abc{ int a; int b;};const abc test[1] ={ {2,2},};//常量数组定义方法. 对象数组(对象数组可以不用初始化,只要定义了默认构造函数便会自动调用;倘若没有定义默认订购函数则需要常量数组在初始化时调用)class abc{public: abc(int ap,int bp): ...
阅读全文
摘要:注:不知道说“偷调函数”说法合不合适,在此也就这样一说了~ 主要有两点: 一、再说C++反汇编函数调用,重点是怎样通过堆栈实现由被调用函数转到调用者 二、在 1 的基础上,在WinDbg下通过修改EIP实现如下一个功能: 有两个函数foo()和hack(),在main函数中调用foo,但是在foo执行过程中,通过修改EIP来调用hack函数,最后再回到main中foo函数的下一条语句 ...
阅读全文
摘要:1.引用与指针选用 如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。2.引用是否占用空间? 应该是占用的,运行时引用的指向并不能明确,所以必须占用空间修改 引用可以作为类成员变量出现。只不过构造函数中需要在初始化列表里面初始化的.
阅读全文
摘要:我们的最终目的是把字符串格式的时间转换为内部使用的“日历时间”,即到UTC 1970年1月1日零时的秒数。这里就存在夏令时的问题。比如俄罗斯时间2008年10月26日2:30由于夏令时的跳变会经过两次,这两次所代表的“日历时间”明显不同。如果仍按照上面的程序,由mktime()函数来决定这个时间是否处于夏令时(它会根据当前时区自动判断,在没有发生时间重叠的情况下处理是正确的)就会有问题。这时我们不能使用ttm.tm_isdst = -1了,而是明确使用ttm_tm_isdst = 1来告知mktime()现在处于夏令时,明确使用ttm.tm_isdst = 0来告知未处于夏令时。 结论:使..
阅读全文
摘要:一、1.一维数组的定义:类型说明符 数组名[常量表达式]; 注意:常量表达式包括常量与符号常量,不能包含变量。 2.一维数组的引用: 数组名[下标]; 3.一维数组的初始化: a.在定义数组时对数组元素赋以初值; b.可以只给一部分元素赋值; c.想使一个数组中全部元素值为0,可以写成:a[10]={0}; 需要注意 int a[10] = {1}; 并不能把数组初始化为全1,只是将第一位初始化为1,后面全部都是0滴. d.在对全部数组元素赋初值时,可以不指定数组长度。二、1.二维数组的定义: 类型说明符 数组名[常量表达式][常量表达式]; 2.二维数组的引用: 数组名[下标][下标]; 3
阅读全文
摘要:首先说说构造函数,大家都知道构造函数里就可以调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就可以调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数,只有这样子类才能在构造函数里使用基类的成员,所以是创建子类时先调用基类的构造函数然后再调用自己的构造函数。通俗点说,你要用某些物品,但这些物品你没办法自己生产,自然就要等别人生产出来,你才能拿来用。接着就是析构函数了,上面说到子类是将基类的成员变成自己的成员,那么基类就会只存在子类中直到子类调用析构函数后。做个假设:假如在基类的析构函数调用比子类的先,这样会发生什么事呢?类成员终止了,而类本身却还
阅读全文
摘要:Escape SequenceRepresents\aBell (alert)\bBackspace\fFormfeed\nNew line\rCarriage return\tHorizontal tab\vVertical tab\'Single quotation mark\"Double quotation mark\\Backslash\?Literal question mark\oooASCII character in octal notation\xhhASCII character in hexadecimal notation\xhhhhUnicode
阅读全文
摘要:在ACE的源代码目录里,有源文件.cpp、头文件.h,我们还发现有以.i和.inl为扩展名的文件。其实,以.i和.inl为扩展名的文件是ACE源码中inline函数的存放形式。在说明ACE中为什么采用这种方式来存放inline函数之前,我们来说一下inline关键字是什么意识。我们知道当调用一个函数的时候,涉及到返回地址和参数压栈等一些操作,这些操作是函数调用本身的开销。在原来的C代码中,通常采用宏定义的方式模拟函数,来消除函数调用的开销,因此我们知道宏是在预编译时候进行处理的。但是,宏定义本身也有很多缺陷,很容易造成错误的使用。这就是inline关键字诞生的原因。用inline关键字定义的函
阅读全文
摘要:struct tm 是否需要初始化,如何初始化,特别是自己构造tm,而不借助库函数解析时间时. 应该初始化m_isdest = -1使用strptime ,因为strptime使用tm当做出参,会帮助初始化tm
阅读全文
摘要:vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public 拷贝构造函数和重载的赋值操作符). 其实很容易理解,自定义一些模板时,同样会需要其实例化类型具备默写操作(如大于小于操作等。) 下面一个自定义模板类就需要dump函数了:template<class T>inline static void Dumpvector(const std::vector<T *> &vvector){ std::vector<T *> ::iterator pvectorIt = vvector.begin(); for(; pvectorIt
阅读全文
摘要:公有继承体现 "是一个" 的含义,但是Student "是一个" Person的事实并不说明Student的数组 "是一个" Person数组。
阅读全文
摘要:(摘自effective C++) 之前使用模板时,只记得有typename,class做参数的。当再看到时,才感觉还是挺神奇。 模板参数并不局限于类型,可以使用编译器内置类型。 template告诉编译器,虽有的定义中将包含一个或多个未确定的量(常量或类型),当该模板产生实际代码时,必须制定这些量
阅读全文
摘要:1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。 2.sizeof是算符,strlen是函数。 3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。sizeof还可以用函数做参数,比如: short f();printf("%d\n", si...
阅读全文
摘要:C++的运算符优先级表 Precedence Operator Description Example Associativity 1 ()[]->.::++-- Grouping operatorArray accessMember access from a pointerMember access from an objectScoping operatorPost-increme...
阅读全文
摘要:拷贝构造函数:只有单个形参,并且该形参时本类对象的引用(经常使用const修饰)的构造函数.默认拷贝构造函数:在没有定义拷贝构造函数的时候,编译器将自动生成一个默认拷贝构造函数将执行的操作:对该类的每个成员执行初始化(对于基础类型直接赋值,对于其所有对象成员逐个调用其对应的拷贝构造函数.)特别的:倘若一个类拥有数组成员,默认拷贝构造函数将复制数组(即复制数组中的每一个元素).自定义拷贝构造函数:只...
阅读全文
摘要:1、如果用容器存副本,则容器销毁的时候,副本也会自动被删除。如果用容器存指针,则容器销毁的时候,不会删除这些指针所指向的对象,因此必须先手工删除完毕之后,再销毁容器。2、如果用容器存副本,其存入、取出的过程是通过拷贝构造函数和赋值操作符来进行的。如果你没有显式地提供这两者,则使用缺省的拷贝构造函数和赋值操作符,其实现方式为:内存复制。例如:假若你没有提供CFileAttribute::operat...
阅读全文
摘要:其实只要让编译器确认了你所要取的值是什么,它自然会帮你取得。只是在我们取得函数指针时是不可以指明参数的,这样子我们该如何告诉编译器我们需要神马呢? 在编译器看来, 重载函数根本就是完全不同的几个函数, 当然就会有不同的函数地址; 我们用常规方法获取的地址只是第一种重载的地址. 下面是引用一段del...
阅读全文
摘要:使用gdb前需要加编译参数 -g 要调试C/C++的程序,首先在编译时,我们必须要把调试信息源程序信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如: gcc -g hello.c -o hello g++ -g hello.cpp -o hello 如果没有-...
阅读全文
摘要:七、八年前写过一篇《用GDB调试程序》,于是,从那以后,很多朋友在MSN上以及给我发邮件询问我关于GDB的问题,一直到今天,还有人在问GDB的相关问题。这么多年来,有一些问题是大家反复在问的,一方面,我觉得我以前的文章可能没有说清楚,另一方面,我觉得大家常问的问题正是最有用的,所以,在这里罗列出来。希望大家补充。 一、多线程调试 多线程调试可能是问得最多的。其实,重要就是下面几个命令: info ...
阅读全文