c/c++
文章平均质量分 84
君记否
么么哒^ ^
展开
-
c++ explicit 关键字解析
C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。 C++中, 一个参数的构造函数, 承担了两个角色。 1 是个构造器 2 是个默认且隐含的类型转换操作符。 所以, 有时候在我们写下如 AAA = XXX, 这样的代码, 且恰好XXX的类型正好是AAA单参数构造器的参数类型, 这时候编译器就自动调用这个构造器, 创建一个AAA的对象。 这样看起来好象很酷, 很方便。 但在某些情况下(见下面权转载 2010-06-17 21:59:00 · 643 阅读 · 0 评论 -
C++ 类的内存结构
<br /> 1。 问题<br /> class A <br /> { <br /> int a; <br /> public: <br /> op(){a=14;}; <br /> int read(){return a ;} <b转载 2010-11-27 14:44:00 · 594 阅读 · 0 评论 -
C++的四种cast操作符的区别
<br />C++的四种cast操作符的区别<br />发信站: 水木社区 (Thu Jan 26 21:15:16 2006), 站内<br /><br />声明 by NetMD:<br />并非我的原创,来自互联网,且是两篇帖子的合集,个人觉得这样才比较完备<br /><br />----------------------------------------------------------------------<br /><br />Q:什么是C风格转换?什么是static转载 2010-11-27 15:48:00 · 403 阅读 · 0 评论 -
什么是回调函数,如何定义和实现一个类的成员函数为回调函数(转)
<br />C/C++中回调函数初探 <br /> 简介 <br /> <br /> 对于很多初学者来说,往往觉得回调函数很神秘,很想知道回调函数的工作原理。本文将要解释什么是回调函数、它们有什么好处、为什么要使用它们等等问题,在开始之前,假设你已经熟知了函数指针。 <br /> <br /> 什么是回调函数?<br /> 简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。 <br转载 2010-11-27 16:26:00 · 5069 阅读 · 0 评论 -
stringstream的用法
<br /><br />stringstream通常是用来做数据转换的。相比c库的转换,它更加安全,自动和直接。<br />例子一:基本数据类型转换例子 int转string<br />#include <string><br />#include <sstream><br />#include <iostream>?<br />int _tmain(int argc, _TCHAR* argv[])<br />{<br />std::stringstream stream;<br />std::s转载 2010-11-30 16:08:00 · 490 阅读 · 0 评论 -
每天一道算法题4 查找最小的k个元素
<br />题目:输入n个整数,输出其中最小的k个。<br />例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。<br />分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数。只是这种思路的时间复杂度为O(nlogn)。我们试着寻找更快的解决思路。<br />我们可以开辟一个长度为k的数组。每次从输入的n个整数中读入一个数。如果数组中已经插入转载 2010-12-01 23:09:00 · 529 阅读 · 0 评论 -
C++类函数指针的使用(收藏)
<br />在注册一个回调函数时候,我们常常使用函数指针.c++/c的连接器在连接程序的时候必须把函数的调用语句上,因此函数地址必须在编译时就确定下来.也就是编译器为函数生成代码的时候. <br /><br /> typedef int(* FuncPtr)(const char*) 定义一个函数指针的类型 <br /><br />类的成员函数有4种类型:inline,virtual,static,normal。inline函数在运行时会展开,虽然语言允许取其地址,但是没有太大的意义.vi转载 2010-12-02 10:38:00 · 713 阅读 · 0 评论 -
Windows下return,exit和ExitProcess的区别和分析- -
<br />通常,我们为了使自己的程序结束,会在主函数中使用return或调用exit()。在windows下还有ExitProcess()和TerminateProcess()等函数。<br />本文的目的是比较以上几种结束程序的方式的区别,并分析其原理。<br /> <br />首先我们用一个例子来说明几种结束方式的区别。<br />测试环境为Windows XP HOME SP2,编译器为Visual Studio.net 2003<br />测试代码如下:<br />#include<br转载 2010-12-03 11:45:00 · 513 阅读 · 0 评论 -
C/C++ Runtime 多线程函数
<br />一 简单实例(来自codeprojct:http://www.codeproject.com/useritems/MultithreadingTutorial.asp)<br />主线程创建2个线程t1和t2,创建时2个线程就被挂起,后来调用ResumeThread恢复2个线程,是其开始执行,调用WaitForSingleObject等待2个线程执行完,然后推出主线程即结束进程。/**//* file Main.cpp<br /> *<br /> * This program原创 2010-12-04 10:07:00 · 614 阅读 · 0 评论 -
用rand()和srand()产生为随机数的方法总结
<br />标准库<cstdlib>(被包含于<iostream>中)提供两个帮助生成伪随机数的函数:<br />函数一:int rand(void);<br />从srand (seed)中指定的seed开始,返回一个[seed, RAND_MAX(0x7fff))间的随机整数。<br />函数二:void srand(unsigned seed);<br />参数seed是rand()的种子,用来初始化rand()的起始值。<br />可以认为rand()在每次被调用的时候,它会查看转载 2010-12-03 14:24:00 · 352 阅读 · 0 评论 -
windows笔记-创建线程的另一个函数_beginthreadex
<br />在多线程环境中存在问题的C/C++运行期库变量和函数包括errno、_doserrno、strtok、_wcstok、strerror、_strerror、tmpnam、tmpfile、asctime、_wasctime、gmtime、_ecvt和_fcvt等。<br />所以如果使用上面的变量或函数的话,若要创建一个新线程,绝对不要调用操作系统的CreateThread函数,必须调C/C++运行期库函数_beginthreadex:<br /> <br />uintptr_t_begi转载 2010-12-04 09:03:00 · 521 阅读 · 0 评论 -
各种排序算法分析总结
<br />排序算法:<br /> 1)分类:<br /> 1)插入排序(直接插入排序、希尔排序)<br /> 2)交换排序(冒泡排序、快速排序)<br /> 3)选择排序(直接选择排序、堆排序)<br /> 4)归并排序<br /> 5)分配排序(箱排序、基数排序)<br /> 所需辅助空间最多:归并排序<br /> 所需辅助空间最少:堆排序<br /> 平均速度最快:快速排序<br /> 不稳定:快速排序,希尔排序,堆排序。<br /> 1)选择排序算法的时候<br /> 1.数转载 2010-12-05 22:30:00 · 708 阅读 · 0 评论 -
每天一道算法题15 含有指针成员的类的拷贝
<br />题目:下面是一个数组类的声明与实现。请分析这个类有什么问题,并针对存在的问题提出几种解决方案。<br />template<typename T> class Array<br />{<br />public:<br /> Array(unsigned arraySize):data(0), size(arraySize)<br /> {<br /> if(size > 0)<br /> da转载 2010-12-07 11:09:00 · 425 阅读 · 0 评论 -
每天一道算法题7 查找链表中倒数第k个结点 ; 输入一个单向链表。如果该链表的结点数为奇数,输出中间的结点;如果链表结点数为偶数,输出中间两个结点前面的一个
<br />typedef struct list_node{<br /> int i;<br /> list_node *next;<br />}LIST_NODE;<br /><br />LIST_NODE *find_node(LIST_NODE *head, int k)<br />{<br /> LIST_NODE *p1 = head;<br /> int count = 0;<br /> while(p1 && count++ < k)<br />原创 2010-12-02 11:30:00 · 1662 阅读 · 2 评论 -
关于C/C++内存管理的几点总结(转)
<br />http://www.cnblogs.com/skynet/archive/2010/12/03/1895045.html 这篇博客最后写了5个规则,虽然简单,但是还是有些问题,在这里稍作说明。<br />【规则1】用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使 用指针值为NULL的内存。<br />偶评:参考wiki百科针对malloc以及new的说明,对于C语言malloc方式,检查NULL是可以的,但是对于C++的new操作符 (operat转载 2010-12-04 11:34:00 · 466 阅读 · 0 评论 -
Ubuntu 下安装 Code::Blocks
<br />在Linux环境下,就不同了。VisualStudio不用想了,地球人都知道是不可能的事。好用的只有Anjuta,KDevelop和Code::Blocks。本人偏爱Gnome,所以KDevelop排除。Anjuta很久很久以前用过,很好用,但是搭配的是GTK。要跨平台开发,非Code::Blocks+wxWidgets莫属。<br />安装步骤:<br />1.先把编译环境,C库、C++库和Boost库装好,如下:<br />sudo apt-get install libc6转载 2010-12-09 21:47:00 · 920 阅读 · 0 评论 -
使用CRT调试内存分配堆来找出未释放的内存空间
<br />忘记释放已经分配的内存是一种常见的编程错误,当然我指的是在C++编程当中,例如下面的代码里面就存在一个忘记释放内存的编程错误。我个人觉得忘记释放内存的编程错误是不可避免的,毕竟程序员都是人,困了,心情不好了,代码过于复杂啦等等都可能导致忘记加上一句delete XXX语句。<br />// 未释放内存空间.cpp : Defines the entry point for the console application.<br /> <br />#include"stdafx.h"<br />#转载 2010-12-10 18:30:00 · 486 阅读 · 0 评论 -
读google c++ 编程规范 中的一点小总结
<br />Google的东西还是要关注一下的咯<br /> <br />一、使用static_cast<>()等c++风格而不要使用C风格类型转换<br />1) static_cast :和 C 风格转换相似可做值的强制转换,或指针的父类到子类的明确的向 上<br />转换;<br />2) const_cast :移除 const 属性;<br />3) reinterpret_cast :指针类型和整型或其他指针间不安全的相互转换,仅在你对所做一<br />切了然于心时使用;<br />原创 2010-10-20 22:28:00 · 625 阅读 · 0 评论 -
wsprintf()函数与输出格式化
<br />在C语言中格式化字符串可以使用printf,但是在WINDOWS编程设计中却行不通了,但是却有变通的方法,那就是用 wsprintf这个函数。它的格式如下:<br />1intwsprintf ( LPTSTRlpOut, // 指向需要输出的字符串的指针2 LPCTSTRlpFmt, //指向格式控制字符串的指针3 …… // 其他可选参数4 );<br />wsprintf(缓转载 2010-10-22 21:49:00 · 1034 阅读 · 0 评论 -
关于VARIANT数据结构的一点疑问
今天在使用vector结构存储的时候,发现push_back时的数据没有问题,但是通过下标或迭代器取出来的时候出现了数据不匹配的情况。具体原因还待研究。 由于时间的关系,我换了一种方式,用vector结构存储,具体过程如下。 VARIANT * pVal; pVal = (VARIANT *)CoTaskMemAlloc(sizeof(VARIANT)); VariantInit(pVal); hr = pclsObj->Get(vec_parameter[i],原创 2010-10-22 11:58:00 · 1015 阅读 · 0 评论 -
复习C++中的几个不常用关键字
<br /> 今天听到一个朋友来TX面试,又问到了生僻的C++关键字,那个汗,记得我那个时候面试的时候也被问到过,特总结如下:<br /> bad_typeid<br /> 很生僻,基本在几年的开发中没有用过,要理解bad_typeid这个关键字,首先得看下typeid这个关键字的使用,下面是一段英文描述:<br />The typeid operator will accept a pointer when dereferenced evaluates to a type:ty转载 2010-12-15 16:43:00 · 428 阅读 · 0 评论 -
Run-Time Check Failure #2 - Stack around the variable 'xxx' was corrupted(待解决)
ProblemThe following error message occurs when building on Test RealTIme environment with the cvisual7 TDP?<br /><br /> Run-Time Check Failure #2 - Stack around the variable 'xxx' was corrupted.Cause Stack pointer corruption is cau转载 2010-10-25 10:34:00 · 1910 阅读 · 0 评论 -
总结函数的参数,指针参数及const修饰的情况
<br /><br />void testn(int n)<br />{<br /> n = 0; //正确,但外部n值未变,小心逻辑错误<br />}<br />void testn(const int n)<br />{<br /> n = 0; //编译错误,加const可以防止逻辑错误<br />}<br />void testn(int* n)<br />{<br /> n = new int(3); //正确,但外部指针n值未变,小心逻辑错误<br />转载 2010-10-25 15:30:00 · 524 阅读 · 0 评论 -
使用VC++检查内存泄露(不懂)
<br /><br />通过调试几个C库中的函数,发现利用VC监测内存泄露的问题需要使用几个CRT调试堆函数,似乎非常的麻烦,本来想放弃这个小节的内容的,但是功夫不负有心人,让我在《代码揭秘-从C/C++的角度探秘计算机系统》(左飞 著)一书中找到了相关知识点的描述,但是书中说这些代码来源于网络,不是其本人编写,所以我也无法确认代码的来源,只好使用拿来主义了,在这里感谢前辈们的辛勤付出。<br /> <br />OK,我要贴代码了:<br />//debug_new.h<br />#ifndef _DE转载 2010-10-26 20:47:00 · 569 阅读 · 0 评论 -
内存泄露问题总结
<br />做了一个小项目,碰到了不少内存泄露的问题,现在总结一下:<br /> <br />1、注意char数组长度过短导致的内存泄露问题。<br />这类溢出问题发生后,一般会报内存错误,但是有时候由于自身的代码做了安全检测,根本察觉不到,只能跟踪各个对象内存地址是否改变来解决。<br /> <br />2、注意VaRIANT变量的使用问题<br />使用VARIANT变量之前,一定要调用VariantClear()函数,否则会造成内存泄露,至于原因,我也说不太清楚,VARIANT变量还有其他的一些原创 2010-10-31 11:27:00 · 514 阅读 · 0 评论 -
使用Hoare算法计算select[k]
<br />问题很简单, n个元素list[0], list[1]... list[n-1], 求其第k小(或大)的元素 (注: 为了简单, 程序中是按照0-index. 也就是说第0小的是最小的,以此类推)<br /><br />最简单的想法, 给这些元素排个序, 自然就出来了. 当然这样弄效率不是很高, 因为计算了许多额外的信息.<br /><br />使用Hoare算法, 可以比较好的解决这个问题.<br /><br />基本思路和快排类似. 分为以下几个步骤:<br /><br />转载 2010-10-31 15:51:00 · 1127 阅读 · 0 评论 -
c++重载>等符
<br />以下示例中定义了一个class test, 重载了<, +, +=, =, ==, <<, >>等符号:<br />#include<iostream><br />#include<vector><br />using namespace std;<br /><br />class test{<br />public:<br /> int v;<br /> /*构造函数*/<br /> test():v(0){}<br /> test(转载 2010-11-01 09:00:00 · 398 阅读 · 0 评论 -
C++实现机制(三)——虚函数表
<br />C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。 <br /> 虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简转载 2010-10-31 10:04:00 · 421 阅读 · 0 评论 -
#ifndef#define#endif的用法
你所遇到的这几个宏是为了进行条件编译。一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。 条件编译命令最常见的形式为: #ifdef 标识符 程序段1 #else 程序段2 #endif 它的作用是:当标识符已经被定义过(一般是用#define命令定义转载 2010-10-31 11:42:00 · 469 阅读 · 0 评论 -
使用 Visual Leak Detector 检测内存泄露
打开Tools -> Options -> Projects and Solutions -> VC++ Directories;然后点击include files下拉列表,在末尾把VLD安装目录中的include文件夹添加进来; 同样点击lib下拉列表,把VLD的lib也添加进来;在需要检测内存泄漏的源文件中添加#include “vld.h”顺序无所谓,但是一定不能在一些预编译的文件前(如stdafx.h)。我是加在stdafx.h文件最后。把安装目录下dll文件夹中的所有dll文件拷贝到工程Debug转载 2010-10-31 09:18:00 · 496 阅读 · 0 评论 -
关于虚基类那点破事
#include<iostream><br />usingnamespace std;<br /><br />classbase<br />{<br />public:<br />base()<br /> {<br /> a=5;<br /> cout<<"base a="<<a<<endl;<br /> cout<<"base constructing..."<<endl;<br /> }<br />protected:<br转载 2010-11-01 14:58:00 · 425 阅读 · 0 评论 -
代码风格总结
1、 关于宏、常量和模板名要全部大小,用下划线隔开;2、 指针标识符名以p开头;3、 _原创 2010-11-02 11:48:00 · 395 阅读 · 0 评论 -
boost库编译命令
bjam stage --toolset=msvc-7.1--stagedir="G:/ChenVCLib/Lib/boost_1_43_0" link=shared runtime-link=shared threading=multi debug release<br /><br />bjam stage --toolset=msvc-7.1--stagedir="G:/ChenVCLib/Lib/boost_1_43_0" link=static runtime-link=static threa转载 2010-12-27 14:46:00 · 720 阅读 · 0 评论 -
c++细节知识总结
<br />2、C++中子类的构造函数是否会自动调用基类构造函数?<br />答:会。如果在子类的构造函数中不显式指定调用基类构造函数,则将自动调用基类缺省构造函数,所以基类一定要有缺省构造函数。如果子类的构造函数除了调用基类构造函数以外什么都不做,不能不写,必须写一个空函数。<br /> <br />5、如何声明一个对象已经在文件外被定义?<br />答:使用extern来声明。可以在多个地方多次声明同一个对象,但是一个对象只能被定义一次,而且多个声明必须明确无误的指向这个定义实体。声明不分配内存转载 2010-12-27 14:59:00 · 461 阅读 · 0 评论 -
探索C++0x: 3. 右值引用(rvalue reference)(本文前段还行)
<br />转载请注明来源: http://blog.csdn.net/thesys/archive/2010/06/06/5651713.aspx<br />简介<br />C++0x中引入了右值引用(rvalue reference)这个设施,形如T&&,用来实现移动语义(move semantics)和完美转发(perfect forwarding)。此前C++中有一个著名的性能问题——复制临时对象,由于右值引用的引入,该问题将得到极大的改善。<br />虽然右值引用的引入是一个很了不起的转载 2010-12-26 21:13:00 · 575 阅读 · 0 评论 -
C++0x的三个特性:右值引用,static_assert,auto
一、右值引用C++0x中引入了右值引用(rvalue reference)这个设施,形如T&&,用来实现移动语义(move semantics)和完美转发(perfect forwarding)。此前C++中有一个著名的性能问题——复制临时对象,由于右值引用的引入,该问题将得到极大的改善。虽然右值引用的引入是一个很了不起的进步,也是一个明智的决定,但它并不那么讨人喜欢,至少我觉得如此。原因有二:首先是其概念本身就不容易理解,增加了一些智力负担;另外如果想享受它带来的性能好处,还必须增加一些编码工转载 2010-12-26 21:41:00 · 690 阅读 · 0 评论 -
C++ Template 中的typename、class关键字
<br /> 在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢?<br /> 相信学习C++的人对class这个关键字都非常明白,class用于定义类,在模板引入c++后,最初定义模板的方法为: template<class T>...... <br />在这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字转载 2010-12-28 11:20:00 · 511 阅读 · 0 评论 -
谈谈#pragma pack
<br /> 这种东西非常无聊,平时用不到,但面试题中出现的概率还不算小,所以稍微总结一下吧。<br /> 各个编译器对这个关键字的支持应该也有差异吧。<br /> <br />· 使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。<br /> · 使用伪指令#pragma pack (),取消自定义字节对齐方式。<br />另外,还有如下的一种方式:<br /> · __attribute((aligned (n))),让所作用的结构成员对齐在n字转载 2010-12-27 15:12:00 · 425 阅读 · 0 评论 -
内存不够处理 -- 自己写new_handler(转:没考虑多线程问题)
<br />如果不满足内存分配请求时,不断重复调用new-handler函数<br />当前的new-handler可以利用set_new_handler安装新的new-handler取代它。/**/////////////////////////////////////////////////////////////<br />//<br />//FileName : lianxi.cpp<br />//Creator : longshen<br />//Date : 2009-7-17<br />转载 2010-12-29 09:24:00 · 891 阅读 · 0 评论 -
理解虚基类、虚函数与纯虚函数的概念
<br />引言<br /><br /> 一直以来都没有写过一篇关于概念性的文章,因为我觉得这些概念性的东西书本上都有并且说的也很详细写来也无用,今天突发奇想想写一写,下面就和大家讨论一下虚基类、虚函数与纯虚函数,一看名字就让人很容易觉得混乱。不过不要紧待看完本文后你就会理解了。<br /><br />正文<br /><br /> 虚基类<br /> 在说明其作用前先看一段代码<br />class A<br />{<br />public:<br />转载 2010-12-30 11:04:00 · 512 阅读 · 0 评论