自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

享受开发技术,享受计算机科学

自问自己:拥有的技术能应用到什么程度,能创造多大的价值

  • 博客(42)
  • 收藏
  • 关注

原创 杂谈:智能指针与库

最近看一些库时发现仅指针一项就有挺多封装, 思考为什么需要智能指针?通过智能指针可以以RAII的方式管理对象, 编写异常安全的代码; 原始的指针没有标明对象所有权的情况, 对象是你单独拥有的?还是你和别人共享对象, 但是你也参与管理? 还是你只是使用对象,但是没有所有权? 智能指针很好的解决了这些问题。下面是一些常见的智能指针封装形式:std::auto_ptr基于所有权的

2013-08-28 16:11:02 645

原创 C++中基于Crt的内存泄漏检测

尽管这个概念已经让人说滥了 ,还是想简单记录一下, 以备以后查询。#ifdef _DEBUG#define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__)#else#define DEBUG_CLIENTBLOCK#endif#define _CRTDBG_MAP_ALLOC#inclu

2013-08-28 15:45:19 744

原创 C语言高效编程的的四大绝招(转载)

引言:编写高效简洁的C语言代码,是许多软件工程师追求的目标。本文就工作中的一些体会和经验做相关的阐述,不对的地方请各位指教。第一招:以空间换时间计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招--以空间换时间。例如:字符串的赋值。方法A:通常的办法:#define LEN 32char string1

2013-08-28 14:21:36 626

原创 C++ string 用法详解

任何人对本文进行引用都要标明作者是Nicolai M.Josuttis///////////////////////////////////////////////////////////////////////////////////C++ 语言是个十分优秀的语言,但优秀并不表示完美。还是有许多人不愿意使用C或者C++,为什么?原因众多,其中之一就是C/C++的文本处理功能太麻烦,用起来

2013-08-28 13:18:21 684

原创 如何使用set::key_comp 和 set::value_comp 标准模板库 (STL) 函数

下面的代码示例演示如何使用 Visual C++ set::key_comp 和 set::value_comp 的 STL 功能。所需要的头文件:原型 template class set { public: // Function 1: key_compare key_comp() const;

2013-08-27 14:09:56 3834

原创 如何处理C++构造函数中的错误

用C++写代码的时候总是避免不了处理错误,一般来说有两种方式,通过函数的返回值或者抛出异常。C语言的错误处理一律是通过函数的返回值来判断的,一般是返回0、NULL或者-1表示错误,或者直接返回错误代码,具体是哪种方式没有统一的规定,各种API也各有各的偏好。譬如fopen函数,当成功时返回文件指针,失败时返回NULL,而POSIX标准的open函数则在成功时返回0或者正数,失败时返回-1,然后需要

2013-08-26 15:52:07 5795

原创 探寻C++最快的读取文件的方案

在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据。一个进阶的方法是把数据一下子读进来,然后再转化字符串,这种方法传说中很不错,但具体如何从没试过,因此今天就索性把能想到的所有的读数据的方式都测试了一边,结果是惊人的。竞赛中读数据的情况最多的莫过于读一大堆整数了,于是我

2013-08-26 14:19:18 845

原创 exit 与 return 的区别

exit(0):正常运行程序并退出程序;exit(1):非正常运行导致退出程序;return:返回函数值,若在主函数中,则会退出函数并返回一值。详细说:  1. return返回函数值,是关键字;  exit 是一个函数。  2. return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束。 

2013-08-25 21:55:54 507

原创 类模板中的友元声明

在类模板中可以出现三种友元声明,每一种都声明了与一个或多个实体的友元关系:(1)普通非模板类或函数的友元声明,将友元关系授予明确指定的类或函数。(2)类模板或函数模板的友元声明,授予实例出的友元模板类或模板函数对其所有实例的访问权。(3)类模板或函数模板的特定实例的友元声明,只授予对类模板或函数模板特定实例的访问权。1.普通友元非模板类或模板函数可以是类模板的友元:

2013-08-25 11:47:32 883

原创 模板的实例化概念

模板是一个蓝图,它本身不是类或函数。编译器用模板产生指定的类或函数的特定类型版本。产生模板的特定类型实例的过程称为实例化,这个术语反映了创建模板类型或模板函数的新“实例”的概念。        模板在使用时将进行实例化,类模板在引用实际模板类类型时实例化,函数模板在调用它或用它对函数指针进行初始化或赋值时实例化。

2013-08-25 10:53:00 764

原创 模板作用域中的模板类型的引用

通常,当使用类模板的名字时候,必须指定模板形参。这一规则有个例外:在类本身的作用域内部可以使用类模板的非限定名。例如:在默认构造函数和复制构造函数的声明中,名字Queue是Queue的缩写表示。实质上,编译器推断,当我们引用类的名字时,引用的是同一版本。因此,复制构造函数定义其实等价于:Queue(const Queue& Q):head(0),tail(0)               

2013-08-25 10:44:56 1000

原创 fstream的使用问题

//问题十八://使用fstream对象时,先读再写就会出问题,需要流指针重新定位才能写。先写再读没有问题,流指针会自动右移一位再读#include #include using namespace std;int main(){fstream stream("hello.txt");if(!stream){cerrexit(-1);}cha

2013-08-24 22:09:31 736

原创 清除文件流的错误状态

考虑这样的程序,它有一个vector对象,包含一些要打开并读取的文件名,程序要对每个文件中存储的单词做一些处理。假设vector对象命名为files,程序也许会有如下的循环:ifstream input;vector::const_iterator it=files.begin();//for each in the vectorwhile(it !=files.end()) {inp

2013-08-24 17:40:33 1035

原创 程序员的困境

英文原文:Programmer’s dilemma  译者:cssmagic原作者: Tyr Chen (@tyrchen),中国人 微博  LinkedIn   最近我为一个内核程序员的职位面试了十几个候选人。这些候选人都来自一些不错的大公司,这些公司在芯片或嵌入式操作系统领域十分有名。这些候选人大多声称自己在内核方面有着十年的在职工作经验。他们的简历看起来非常耀眼—

2013-08-24 13:17:10 573

原创 浅析 位域

可以声明一种特殊的类数据成员,称为位域(bit-field),来保存特定的位数。当程序需要将二进制数据传递给另一程序或硬件设备的时候,通常使用位域。注解:位域在内存中的布局是机器相关的。    位域必须是整型数据类型,可以说是uigned或unsigned 。通过在成员名后面接一个冒号以及指定位数的常量表达式,指出成员是一个位域:typedif unsigned

2013-08-23 16:49:46 687

原创 中英文颜色对照表(转载)

颜色英文代码形像颜色HEX格式RGB格式 LightPink浅粉红#FFB6C1255,182,193 Pink粉红#FFC0CB255,192,203 Crimson猩红#DC143C220,20,60 LavenderBlush脸红的淡紫色#FFF0F5255,240

2013-08-23 16:34:47 786

原创 c++中冒号(:)和双冒号(::)的区别

1.冒号(:)用法 (1)表示机构内位域的定义(即该变量占几个bit空间) typedef struct _XXX{ unsigned char a:4; unsigned char c; } ; XXX (2)构造函数后面的冒号起分割作用,是类给成员变量初始化的方法,初始化列表,更适用于成员变量的常量const型。 struct _XXX{

2013-08-23 15:15:54 978

原创 new能够返回NULL么?

我们经常看到有很多初学者喜欢写如下代码:    A* p=new A();    if(p==NULL) ....    写下这段代码的可能是受到了一些书上错误的影响,因为new A()从来就不可能返回NULL,如果在这个过程中用完了内存,那么他就会抛出bad_alloc异常,绝对不会返回NULL,如果你想让他返回null,应该用new(nothrow) A(),而不是new A(

2013-08-23 14:59:09 1389

原创 浅析 虚函数表

C++中的虚函数的实现一般是通过虚函数表(C++规范并没有规定具体用哪种方法,但大部分的编译器厂商都选择此方法)。        类的虚函数表是一块连续的内存,每个内存单元中记录一个JMP指令的地址。        注意的是,编译器会为每个有虚函数的类创建一个虚函数表,该虚函数表将被该类的所有对象共享。类的每个虚成员占据虚函数表中的一行。如果类中有N个虚函数,那么其虚函数表将有N*4字节的

2013-08-22 23:56:51 589

原创 STL备忘录(转载)

1. string.empty() 不是用来清空字符串,而是判断string是否为空,清空使用string.clear();2. string.find等查找的结果要和string::npos比较,而不是和-1比较。(各个平台可能不同)3. 将string转为char * ,用char * t = (char *)s.c_str() ,而不是 char *t =s.begin()

2013-08-22 14:47:55 607

原创 我谈windows函数的返回值规律

在windows的世界里面,很少有API没有返回值。但是到底返回什么代表成功,这个没有标准。我发现主要有三种模式1 . 返回非0表示成功,返回0表示失败大多数Win32 Platform API都是这样,比如int result =MoveFileEx(szTempName,                     "allcaps.txt",

2013-08-22 13:49:24 1054

原创 最好使用未命名的命名空间取代文件中的静态声明

在标准C++中引入命名空间之前,程序必须将名字声明为static,使它们局部于一个文件。文件中静态声明的使用从C语言继承而来,在C语言中,声明为static 的局部实体在声明它的文件之外不可见。      C++不赞成文件静态声明。不赞成的特征是在未来版本中可能 不支持的特征。应该避免文件静态而使用未命名的命名空间代替。      详情请见C++ primer 605页。

2013-08-22 00:57:07 998

原创 避免using 指示

using 指示注入来自一个命名空间的所有名字,它的使用是靠不住的:只用一个语句,命名空间的所有成员名就突然可见了。虽然这个方法看似简单,但也有它自身的问题。如果应用程序使用很多库,并且用using 指示使得这些库中的名字可见,那么,全局命名空间污染问题就重新出现。      而且,当引入库的新版本的时候,正在工作的程序可能会编译失败。如果新版本引入一个与应用程序正在使用的名字冲突的名字,就会

2013-08-22 00:55:48 645

原创 string使用小结

看了The C++ Programming Language的第二十二章 串,记一下笔记:c++之父给出的关于string的忠告1:尽量使用string操作,少用c风格字符串函数2:用string作为变量或者成员,不作为基类3:你可以将string作为参数值或者返回值,让系统去关心存储管理问题4:当你希望做范围检查时,请用at()而不是迭代器或者[]5:当你希望优化速度

2013-08-22 00:45:48 600

原创 switch内部定义变量须注意的问题

对于switch结构,只能在它的一个case标号或default标号后面定义变量。制定这个规则是为了出现代码跳过变量的定义和初始化的情况。  让我们来回顾变量的作用域,变量从它的定义点开始有效,直到它所在所在块结束为止。现在考虑如果在两个case标号之间定义变量会出现什么情况。该变量会在该块结束之前一直存在。对于定义该变量的标号后面的其他case标号,它们所关联的代码都可以使用这个变量。如果s

2013-08-21 23:54:57 2364

原创 屏蔽控制台

#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )  // 设置连接器选项

2013-08-21 23:24:56 670

原创 不用中间变量实现交换

void swap(int& lhs, int& rhs){lhs=lhs+rhs;rhs=lhs-rhs;lhs=lhs-rhs;}void swap(int& lhs, int& rhs){lhs=lhs^rhs;rhs=lhs^rhs;lhs=lhs^rhs;}当lhs,rhs相加的结果超过了int的最大范围,则会有溢出的情

2013-08-21 21:58:58 613

原创 浅析 枚举类型

为了揭开隐藏在枚举背后的秘密,让我们来举例说明。假如我们希望声明一些类型为weight的变量,并且这些变量的值只局限于一个很小的范围内。我们可以按照下面的方式定义一个枚举:enum weight { light, medium, heavy, very_heavy };  符号常量light、media、heavy和very_heavy用符号的形式表示了我们希望一个类型为wei

2013-08-21 21:43:31 627

原创 智能指针std::auto_ptr

auto_ptr是当前C++标准库中提供的一种智能指针,或许相对于boost库提供的一系列眼花缭乱的智能指针, 或许相对于Loki中那个无所不包的智能指针,这个不怎么智能的智能指针难免会黯然失色。诚然,auto_ptr有这样那样的不如人意,以至于程序员必须像使用”裸“指针那样非常小心的使用它才能保证不出错,以至于它甚至无法适用于同是标准库中的那么多的容器和一些算法,但即使如此,我们仍然不能否认这个

2013-08-21 20:48:07 782

原创 浅析 this指针

1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。 例如,

2013-08-21 20:39:43 585

原创 重新抛出(rethrow)

有可能单个catch不能完全处理一个异常。在进行了一些校正行动之后,catch可能确定该异常必须由函数调用链中更上层的函数来处理,catch可以通过重新抛出(rethrow)将异常传递给函数调用链中更上层的函数。重新抛出是后面不跟类型或表达式的一个throw:    throw;空throw语句将重新抛出异常对象,它只能出现在catch或者从catch调用的函数中。如果在处理代码不活动时碰

2013-08-21 19:31:37 2002 2

原创 捕获所有异常的处理代码

即使函数不能处理被抛出的异常,它也可能想要在随抛出异常退出之前执行一些动作。除了为每个可能的异常提供特定catch子句之外,因为不能指定被抛出的所有异常,所以可以使用捕获所有异常catch子句(catch-all)的。捕获所有异常的catch子句形式为(...)。例如:// matches any exception that might be throwncatch(...){

2013-08-21 18:41:02 835

原创 C++嵌套类的使用方法

在一个类的内部定义另一个类,我们称之为嵌套类(nested class),或者嵌套类型。之所以引入这样一个嵌套类,往往是因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现,且同时可以对用户隐藏该底层实现。    虽然嵌套类在外围类内部定义,但它是一个独立的类,基本上与外围类不相关。它的成员不属于外围类,同样,外围类的成员也不属于该嵌套类。嵌套类的出现只是告诉外围类有一

2013-08-21 11:03:52 1041

原创 切记!布尔变量必须初始化

最近在使用布尔变量时,遇到如下问题,代码如下:#include using std::cout;using std::endl;void main(void){ bool bState; if (bState) { cout<<"ok!"<<endl; } else { cout<<"error"<<endl; }}这段代码在VS2003上编译时没

2013-08-21 10:51:35 1109

原创 嵌套类可以访问外围类的私有成员

看c++primer时读到一句话 ——p800页关于nested class的,listitem is not permitted to access a private data member of its enclosing class, such as list.意思是说,内部类不能访问外部类的私有成员,但我自己做了实验,内部类是可以访问外部类的私有成员的.最后翻

2013-08-20 22:38:54 1645

原创 绝不能在构造函数与析构函数中调用virtual 函数

在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class (比起当前执行构造函数和析构函数那层).例子:

2013-08-20 22:32:46 1141

原创 struct与class的区别

第一点,默认对成员的访问权限不同。第二点,默认继承方式不同。第三点,class可以用来声明模板形参是类型形参,而struct不行

2013-08-20 21:34:52 568

原创 有子对象的派生类的构造函数

类的数据成员中还可以包含类对象,如可以在声明一个类时包含这样的数据成员:   Student s1;// Student是已声明的类名,s1是Student类的对象这时,s1就是类对象中的内嵌对象,称为子对象(subobject),即对象中的对象。通过例子来说明问题。例: 包含子对象的派生类的构造函数。为了简化程序以易于阅读,这里设基类Student的数据成员只有两个,即num

2013-08-20 16:54:25 1290

原创 39岁研究生毕业14年的经验和教训(转载)

我今年39岁了,25岁研究生毕业,工作14年,回头看看,应该说走了不少的弯路,有一些经验和教训。现在开一个小公司,赚的钱刚够养家糊口的。看看这些刚毕业的学生,对前景也很迷茫,想抛砖引玉,谈谈自己的看法,局限于理工科的学生,我对文科的不懂,身边的朋友也没有这一类型的。  91年研究生毕业,那时出路就是1种:留在北京的国营单位,搞一个北京户口,这是最好的选择。到后来的2~3年内,户口落定了,又

2013-08-20 15:44:35 738

原创 C++流重定向

我们使用STL编程的时候有时候会想到把一个流对象指向的内容用另一个对象来输出,比如想把一个文件的内容输出到显示器上,我们可以用简单的两行代码就可以完成:  ifstream fileRead("test.txt",ios::in);  cout上面的代码就把fileRead流对象中的流重定向到标准输出cout上,你可以在屏幕上看到test.txt的内容C

2013-08-08 10:37:24 1121

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除