C++
文章平均质量分 79
SHIroh
这个作者很懒,什么都没留下…
展开
-
1. C++实现Creational - Singleton模式
1. C++实现Creational - Singleton模式 Singleton设计模式经常被大家谈及,很多人认为该模式很简单。的确,从纯粹的设计模式的角度来看,它并不复杂,但是从实现的角度来看,其实非常不简单,尤其是用C++去实现它的时候。 一、Java版本的Singleton模式实现我们不妨先看看在Java中实现Singleton模式的典型代码转载 2012-03-28 22:51:43 · 441 阅读 · 0 评论 -
怎样获得虚函数指针
先还是看看下面的代码: #include using namespace std; class A{private: int a; int b;public: virtual void vfun0() { cout "A::vfun0"转载 2012-03-28 23:17:33 · 416 阅读 · 0 评论 -
vector用erase删除元素时,为什么被删元素的析构函数会被调用更多次?
博文 http://patmusing.blog.163.com/blog/static/13583496020101831514657/ 中提到:“vector::erase的原型如下:iterator erase(iterator position);iterator erase(iterator first, iterator last);对应的相关转载 2012-03-28 23:19:30 · 4263 阅读 · 0 评论 -
STL中vector值得注意的两个问题
一、 相关背景:1. 在STL有非常重要的两块内容,一个是容器,另外一个是算法。2. 容器有顺序容器、关联容器和顺序容器适配器之分。算法独立于容器存在,但可以和容器紧密结合使用,从而发挥出相当大的威力。3. 顺序容器包括:vector、list和deque关联容器包括:map、multimap、set和multiset转载 2012-03-28 23:21:26 · 540 阅读 · 0 评论 -
友元函数和友元类
本文是在http://www.cppblog.com/twzheng/articles/21020.html的基础上,增加了两个示例代码。 采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友转载 2012-03-28 23:30:56 · 384 阅读 · 0 评论 -
What's stdcall, cdecl, etc....
在C语言中,假设我们有这样的一个函数:int function(int a,int b)调用时只要用result = function(1,2)这样的方式就可以使用这个函数。但是,当高级语言被编译成计算机可以识别的机器码时,有一个问题就凸现出来:在CPU中,计算机没有办法知道一个函数调用需要多少个、什么样的参数,也没有硬件可以保存这些参数。也就是说,计算机不知道怎么给这转载 2012-03-29 23:58:08 · 388 阅读 · 0 评论 -
不定参数的应用
不定参数当年做为C/C++语言一个特长被很多人推崇,但是实际上这种技术并没有应用很多。除了格式化输出之外,我实在没看到多少应用。主要原因是这种技术比较麻烦,副作用也比较多,而一般情况下重载函数也足以替换它。尽管如此,既然大家对它比较感兴趣,我就简单总结一下它的使用和需要注意的常见问题。原理刚学C语言的时候,一般人都会首先接触printf函数。通过这个函数,你可以打印不定个数的变量到转载 2012-03-30 00:00:57 · 327 阅读 · 0 评论 -
指针作参数的常见错误
一、对参数指针的地址修改参数的地址是可以修改的,修改后的地址是不可能传回给调用处的指针变量。也就是说,可以修改参数地址所指的单元的值,这是可以传回到调用处的变量里面的。#include #include #include int subFunc(int arr[3]);//交换两整数void change(int *data1, int *data2) { in转载 2012-03-30 01:44:41 · 564 阅读 · 0 评论 -
C++内存管理
http://www.cnblogs.com/wonderKK/archive/2012/03/18/2405196.html[导语]内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此转载 2012-04-09 01:29:28 · 444 阅读 · 0 评论 -
Effective C++ 第三版中文版 笔记
条款54 TR1 和 条款55 BoostTR1 即 Technical Report 1 是 C++ standard committee 推出C++“0x”(与此类似的还有C++“89”,即89年的C++标准版本,这里指200X年讲推出的新版本) 之前的 一份技术文档那个,我们可以从中发现一部分即将被实现和规范的内容C++标准程序库 包含了 STL , iostream原创 2012-05-08 01:17:08 · 967 阅读 · 0 评论 -
关于C++中的前置声明
今天一朋友问及C++中的前置声明问题,下面是我给出的回答。 在编写C++程序的时候,偶尔需要用到前置声明(Forward declaration)。下面的程序中,带注释的那行就是类B的前置说明。这是必须的,因为类A中用到了类B,而类B的声明出现在类A的后面。如果没有类B的前置说明,下面的程序将不同通过编译,编译器将会给出类似“缺少类型说明符”这样的出错提示。代码一:转载 2012-03-28 23:16:29 · 298 阅读 · 0 评论 -
关于C++中的前置声明
今天一朋友问及C++中的前置声明问题,下面是我给出的回答。 在编写C++程序的时候,偶尔需要用到前置声明(Forward declaration)。下面的程序中,带注释的那行就是类B的前置说明。这是必须的,因为类A中用到了类B,而类B的声明出现在类A的后面。如果没有类B的前置说明,下面的程序将不同通过编译,编译器将会给出类似“缺少类型说明符”这样的出错提示。代码一:转载 2012-03-28 23:13:32 · 399 阅读 · 0 评论 -
C++中虚继承防止二义性
虚继承,就是在被继承的类前面加上virtual关键字,这时被继承的类称为虚基类,如下面代码中的base类。虚继承在多重继承的时可以防止二义性。 class base; class derived1 : virutal public base; class derived2 : virtual public base; class de转载 2012-03-28 23:09:26 · 484 阅读 · 0 评论 -
C++是如何利用虚函数实现多态性的?
前一篇:http://patmusing.blog.163.com/blog/static/1358349602010419111919799/还是先看示例程序,用代码说话:#include iostream>using namespace std; class A{public: inline virtual voi转载 2012-03-28 23:04:54 · 431 阅读 · 0 评论 -
花括号({...})在自动资源释放中的作用
在C/C++,我们司空见惯地甚至想当然地使用{},一般大家都认为只要 { 和 } 成对出现就可以了。诚然,{ 和 } 必须成对出现,但有些时候,尤其是在使用RAII的时候,它代表了RAII对象的作用域。关于RAII的原理说明,请见:http://patmusing.blog.163.com/blog/static/13583496020101824142699/ 参考下面代码,并注意其转载 2012-03-28 23:23:44 · 783 阅读 · 0 评论 -
使用auto_ptr需要注意的事项
a. auto_ptr定义于头文件memory中; b. auto_ptr只能用来管理单个动态创建的对象,而不能管理动态创建的数组; c. 和其他copy和assign不同,auto_ptr的copy和assign会改变右边的操作数,assignment符号的两边的auto_ptr均为左值;There is a crucially important diffe转载 2012-03-28 23:24:21 · 388 阅读 · 0 评论 -
动态分配资源的自动释放 – auto_ptr的实现原理
动态分配资源的自动释放的英文是 Resource Allocation In Initialization,通常缩写成RAII。根据《C++ Primer》第4版:“During stack unwinding, the function containing the throw, and possibly other functions in the call cha转载 2012-03-28 23:26:21 · 588 阅读 · 0 评论 -
关于《程序员面试宝典》中一道面试题的答案
说明:本文是前段时间发表在CSDN上的文章。后来通读了《程序员面试宝典》,发现里面给出的错误答案很多,所以除非是你特别明确的问题,不要轻易相信其中的结论:) 今天一朋友拿着《程序员面试宝典》来和我商量一道题目,以前听说过这本书的大名,一直无缘得见,今日一见,信手一翻,对于求职的程序员来说的确是一本不错的书:)下面就是朋友谈及的那个问题(括号中的中文是作者翻译的):转载 2012-03-28 23:32:27 · 1081 阅读 · 0 评论 -
函数指针的几种用法
什么是函数指针?函数指针指向的是特殊的数据类型,函数的类型是由其返回的数据类型和其参数列表共同决定的,而函数的名称则不是其类型的一部分。 一个具体函数的名字,如果后面不跟调用符号(即括号),则该名字就是该函数的指针(注意:大部分情况下,可以这么认为,但这种说法并不很严格)。 函数指针的声明方法// 定义函数指针pfint (*pf)(cons转载 2012-03-28 23:33:45 · 399 阅读 · 0 评论 -
拷贝构造函数及其参数类型
拷贝构造函数的参数类型必须是引用,而且通常情况下还是const的,但是const并不是严格必须的。#include #include using namespace std; class CClass{public: CClass() : a(1), b("Hello, world.") {转载 2012-03-28 23:34:50 · 485 阅读 · 0 评论 -
类在其自身的定义体内作为数据类型
只有static成员变量,指针或者引用,才可以在一个类的定义体内,用本类作为数据类型,如:class Bar{public: ......private: static Bar member1; //OK转载 2012-03-28 22:59:00 · 286 阅读 · 0 评论 -
隐式类型转换和explicit关键字的作用
《C++ Primer》(英文版,第4版) p. 461提到:A constructor that can be called with a single argument defines an implicit conversion from the parameter type to the class type.(如果一个类的构造函数只接收一个实参(argument),那转载 2012-03-28 22:59:51 · 376 阅读 · 0 评论 -
关于函数返回值的几种情况
在一个函数的内部,return的时候返回的都是一个拷贝,不管是变量、对象还是指针都是返回拷贝,但是这个拷贝是浅拷贝。 1. 如果返回一个基本类型的变量,比如:int a;a = 5;return a; 那么就会a的一个拷贝,即5返回,然后a就被销毁了。尽管a被销毁了,但它的副本5还是成功地返回了,所以这样做没有问题。转载 2012-03-28 23:02:17 · 334 阅读 · 0 评论 -
static_cast、dynamic_cast、reinterpret_cast和const_cast之间的区别
C-style cast举例: int i; double d; i = (int) d; 上面的代码就是本来为double类型的d,通过(int)d将其转换成整形值,并将该值赋给整形变量i (注意d本身的值并没有发生改变)。这就是典型的c-style类型转换。 下面是一个简单的程序:#include using name转载 2012-03-28 23:08:46 · 320 阅读 · 0 评论 -
C++ Exception
void fun(SimpleClass*)在DEBUG中使用Assert可以 用#define NDBEUG 在release版本中关掉这个功能#include #include using namespace std;class MyError : public runtime_error{ public: MyError(const string& ms原创 2012-06-14 14:05:47 · 799 阅读 · 0 评论