
C++
文章平均质量分 75
猫已经找不回了
猫已经找不回了
展开
-
C/C++板块常见问题集:(写给新手),欢迎大家补充
前言:多给你自己几分钟,耐心的分析一下,不要习惯性的一遇到问题就想找高手帮你解决,耐心点,多想,多看,多练,你就是高手. 主要目的是总结C/c++理一些常见的错误,随手引用或者写的(被我引用了的朋友应该不会介意吧..),自然不够详尽,对涉及的具体问题有兴趣的朋友可以google,这里不浪费时间和篇幅了. 暂时整理出一些,时间跟精力有限,请大家多补充或指正 希望相关方面有问题的朋友们可以先看看此贴,原创 2009-03-02 19:10:00 · 1592 阅读 · 3 评论 -
(转)c++对象内存分析2
<br />前言 本章节讨论单继承情况下类对象的内存特性。阅读时请思考这几个问题:从子类到基类的类型转换,编译器做了什么?多态是怎么实现的?类的成员函数(包括虚函数)和普通函数有什么区别吗?<br />Subject2:从带虚函数的基类继承的子类 类CFinal是我们要分析的目标,它从CBasic中继承而来,重写(override)了虚函数add;增加了一个新的虚函数;增加了一个成员变量iFinal,类图如下:<br /><br />代码:<br />class CBasic <br />{ <转载 2010-07-08 16:20:00 · 2445 阅读 · 0 评论 -
(转)c++对象内存分析3
<br /> 前言 在第二节我们讲到从带虚函数的基类继承的子类,有一个虚函数指针在对象的最前端。但是,如果基类没有虚函数而子类有呢?阅读本节请思考下面的问题:没有虚函数的基类,会有虚函数指针和虚函数表吗?从该类继承的子类,内存中的元素如何布局。<br /> Subject3:从不带虚函数的基类继承的子类 我们把上一节的CBasic类的2个虚函数删除,CFinal从CBasic类继承并增加新的虚函数AVG。类图如下:<br /><br />class CBasic <br />{ <br />转载 2010-07-08 16:20:00 · 1743 阅读 · 1 评论 -
(转)c++对象内存分析4
<br /> 前言 本章节是4个课题的最后一个,我们将讨论多重继承情况下,对象内存的布局。阅读本文,请思考下面的问题:当子类从多个基类继承,虚函数指针和成员变量将如何布局?编译器如何进行子类和基类之间类型转换?如果多个基类具有同样的虚函数,子类选择哪个实现来调用?如果子类重写该虚函数,那么它覆盖的是哪个基类的实现呢?<br /> 多重继承 我们将分析这样的例子:CFinal类继承自CBasic类和CBasic1类;CBasic类和CBasic1类都定义有虚函数add和minus;CBasic类和转载 2010-07-08 16:21:00 · 1620 阅读 · 0 评论 -
(转)c++对象内存分析5
<br /><br /> 前言 前面4节我们已经完成了对4种C++对象布局的分析,本文试图覆盖更多的,常见的C++面向对象的概念。所以,最后2节将继续阐述2个主题:接口和抽象类以及构造函数、虚构函数和虚析构函数。<br /> 接口 这里我准备只主要阐述接口,而不谈一般的抽象类。因为在C++中,是没有“接口”这种类型的,所有的接口事实上是定义为纯抽象类。所谓纯抽象类,就是没有成员变量,没有实现了的函数,只有纯虚函数的抽象类。我相信,理解了接口这种特殊的抽象类,再去理解一般的抽象类是很容易的。<br转载 2010-07-08 16:22:00 · 1782 阅读 · 0 评论 -
STL的写时拷贝(Copy-On-Write)
<br />原作地址:<br />http://hi.baidu.com/jakisou/blog/item/255e9cd66f16a72a06088b20.html<br /> <br />1、概念<br /><br /> <br />Scott Meyers在《More Effective C++》 中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里,做出一副正在复习功课的样子,其 实你在干着别的诸如给班上的某位女生写情书之类的事,而一旦你转载 2010-07-22 14:53:00 · 2867 阅读 · 3 评论 -
C++中enum枚举类型成员重名问题的解决方法 - Enum枚举类型的类封装(转)
<br />C++语言中,对于一个枚举类型(enum),其成员值在所属枚举类型的声明作用域内是不可重复的。这个继承自C语言的特性,使我在写程序时碰到有相同名称的枚举成员时,苦于寻找且方便易读的替代枚举名称。<br />这在C++程序开发方面带来了许多的不方便,在涉及枚举类型时必须时刻关注与现有的枚举变量是否有重名,在一定程度上限制了命名的自主性,也会降低程序的可读性。而在Visual Basic 6和.net系列语言中,两个不同的Enum类型可以具有相同的成员,在使用时只需加上Enum类型名称。目前就是要在转载 2010-11-29 14:51:00 · 5922 阅读 · 1 评论 -
(转)c++操作符重载
<br />http://www.cppblog.com/shongbee2/archive/2009/04/01/78554.aspx<br /> <br />只转链接,save~!转载 2011-06-01 23:31:00 · 1490 阅读 · 0 评论 -
(转)迅雷C++试题及解答
1.下列程序的输出结果为:(B)#includevoid main(){ char* a[ ] = { "hello", "the", "world"}; char** pa = a; pa++; cout}A) theworld B) the C) ello D) ellotheworld 2. 已原创 2011-06-13 21:53:00 · 4171 阅读 · 4 评论 -
一道关于c++拷贝构造与=运算符的题目
class A{public: A() { printf(" A "); } ~A() { printf(" ~A "); }};class B{public: B(A &a):_a(a) { printf(" B "); }原创 2011-06-15 20:35:00 · 2379 阅读 · 2 评论 -
一种固定内存池的实现(含代码)
所谓内存池,是指,应用程序可以通过系统的内存分配调用预先一次性申请适当大小的内存作为一个内存池,之后应用程序自己对内存的分配和释放则可以通过这个内存池来完成。只有当内存池大小需要动态扩展时,才需要再调用系统的内存分配函数,其他时间对内存的一切操作都在应用程序的掌控之中。应用程序自定义的内存池根据不同的适用场景又有不同的类型。从线程安全的角度来分,内存池可以分为单线程内存池和多线程内存原创 2009-09-10 12:31:00 · 7796 阅读 · 8 评论 -
C++ 对比虚函数的动态绑定
直接看这段代码 class CBase{public: virtual int func(int num=1) const //虚函数 { cout<<"CBase function! "<<num<<endl; return 0; } int fun2() { cou原创 2009-06-13 15:43:00 · 4991 阅读 · 3 评论 -
排序——快速排序(QuickSort)
有些东西再不贴出来,以后可能再也找不到了。陆续整理曾写过的排序算法。 快速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。原理不多做介绍了,有需要可以看看这里:http://www.原创 2009-09-16 15:10:00 · 7611 阅读 · 7 评论 -
头文件不宜定义变量原因解析
转自:http://hi.baidu.com/zengzhaonong/blog/item/8c10e90366c2bf733912bbb0.html http://blog.youkuaiyun.com/wzsbll/article/details/6655919转载 2011-07-28 10:09:12 · 3695 阅读 · 0 评论 -
(转)C/C++ 宏详解
众多C++书籍都忠告我们C语言宏是万恶之首,但事情总不如我们想象的那么坏,就如同goto一样。宏有一个很大的作用,就是自动为我们产生代码。如果说模板可以为我们产生各种型别的代码(型别替换),那么宏其实可以为我们在符号上产生新的代码(即符号替换、增加)。关于宏的一些语法问题,可以在google上找到。相信我,你对于宏的了解绝对没你想象的那么多。如果你还不知道#和##,也不知道prescan原创 2009-11-08 09:52:00 · 8598 阅读 · 5 评论 -
.h和.cpp文件的区别
关于头文件和源文件的分别首先,我们可以将所有东西都放在一个.cpp文件内.然后编译器就将这个.cpp编译成.obj,obj是什么东西?就是编译单元了.一个程序,可以由一个编译单元组成,也可以有多个编译单元组成. 如果你不想让你的源代码变得很难阅读的话,就请使用多个编译单元吧.(一个函数不能放到两个编译单元里面,但两个以上就可以分别放在一个单元,也就是cpp里面)转载 2009-10-10 11:20:00 · 16265 阅读 · 6 评论 -
构造函数的2句话
1.“构造函数最重要的作用是创建对象本身,对象内存的分配由构造函数来完成的”这句话是错的,对象内存的分配和构造函数没有关系,对象内存的分配是由编译器来完成的,构造函数的作用是对对象本身做初始化工作,也就是给用户提供初始化类中成员变量的一种方式,在类对象有虚表的情况下,构造函数还对虚表进行初始化。2.C++又规定,如果一个类没有提供任何的构造函数,则C++提供一个默认的构造函数(由C++编译器提供)原创 2009-07-04 18:05:00 · 3229 阅读 · 6 评论 -
由PRIVATE VIRTUAL想到的语意学(SEMANTIC )
声明:跟别人讨论某个帖子,该老兄用到了pivate vitual,我当时的编译完后的反应是virtual不受private限制,后来遇到这篇文章,与大家分享一下。 /*************分隔符 ***********************************/ 今天在整理以前的学习文档时,找到了一篇关于模式的文章(原文见http://dev.youkuaiyun.com/develop转载 2009-03-01 20:22:00 · 1386 阅读 · 0 评论 -
(转)C++中extern “C”含义深层探索
1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不转载 2009-04-16 10:22:00 · 2542 阅读 · 4 评论 -
(转)map插入自定义对象小结
难道插入map还有什么讲究吗?我们且看map在STL中的定义方法: template , class Alloc = alloc> 第一个参数Key是关键字类型第二个参数T是值类型第三个参数Compare是比较函数(仿函数)第四个参数是内存配置对象 map内部存储机制实际是以红黑树为基础,红黑树在插入节点时,必须依转载 2009-04-16 10:24:00 · 7320 阅读 · 1 评论 -
关于多维数组的下标重载
今天看到有人问,在2维或者多维数组的情况下怎样重载像[][]这样的操作符号。其实思路也不难啊,只不过是重载2个[]符号而已,并且2个[]的功能各不一样。 第一个[]应该定位行.最后一个[]应该返回最终数据的引用。 贴一下实现基本功能的代码吧,像越界检测,及其他功能就没写了,只要体现了思路,其他的功能好加。 #include iostream> #include st原创 2009-04-25 17:53:00 · 2383 阅读 · 1 评论 -
操作符重载(小原则)
一.运算符重载的含义与定义方式l C++已有的运算符只适合处理C++的基本数据类型。l C++允许重新定义已有的运算符(运算符重载),以便它能处理程序员定义类型(类类型)。l 运算符重载就是赋予已有的运算符多重含义。运算符重载与函数重载类似,是它的特殊类型。l C++通过重新定义运算符,使它能够用于特定类的对象执行特定转载 2009-04-26 12:53:00 · 2221 阅读 · 0 评论 -
关于cout输出字符串指针
char *p="abcd"; 在C语言里,输出一个字符串的指针很方便,直接printf("%p/n",p);就输出了。而C++里cout太自作聪明了,为了省去我们循环输出字符的麻烦,cout 这个时候要输出p的指针值就只能先将其转为void *再输出。因为void型, cout没法输出,只能乖乖输出指针。此外cout void main(){ char *p2=原创 2009-04-27 16:16:00 · 26800 阅读 · 6 评论 -
C++虚函数表解析(转) ——写的真不错,忍不住转了
C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。 关于虚函数的使用方法,我在这里不做过多转载 2009-04-29 16:29:00 · 33019 阅读 · 76 评论 -
由类的成员函数深入指针
先看这样一段代码 class test { public: test(int i){ m_i=i;} test(){}; void hello() { printf("hello/n"); } private: int m_i; }; int main() { test *p=new test(); p->hello(); p=NULL; p->hello(); }原创 2009-05-06 00:22:00 · 6716 阅读 · 11 评论 -
类的大小——sizeof 的研究(1)
先看一个空的类占多少空间? class Base{public: Base(); ~Base();}; 注意到我这里显示声明了构造跟析构,但是sizeof(Base)的结果是1. 因为一个空类也要实例化,所谓类的实例化就是在内存中分配一块地址,每个实例在内存中都有独一无二的地址。同样空类也会被实例化,所以编译器会给空类隐含的添加一个字节原创 2009-05-12 17:09:00 · 24601 阅读 · 12 评论 -
类的大小——sizeof 的研究(2.虚函数继承)
上一篇文章研究了关于类大小的4条规则后,我们再结合虚函数表,来研究下类的大小。 class Base{public: Base(){}; virtual ~Base(){}; void set_num(int num) { a=num; } virtual int get_num() { return a; }private:原创 2009-05-12 18:59:00 · 7388 阅读 · 4 评论 -
宽字符跟ASCII——区别及测试
一.宽字符介绍 首先说,什么是ASCII,ASCII是用来表示英文字符的一种编码规范。每个ASCII字符占用1个字节,因此,ASCII编码可以表示的最大字符数是255(00H—FFH)。其实,英文字符并没有那么多,一般只用前128个(00H—7FH,最高位为0),其中包括了控制字符、数字、大小写字母和其它一些符号。而最高位为1的另128个字符(80H—FFH)被称为“扩展ASCII”,原创 2009-05-18 15:28:00 · 11305 阅读 · 7 评论 -
iostream 与iostream.h区别(转)
C++的标准类库被修订了两次,有两个标准 C92和C99,这两个库现在都在并行使用,用 .h 包含的是c92 ,不带 .h 的是c99的头文件,对于普通用户来说这两者没有什么区别,区别是在内部函数的具体实现上。旧的C++头文件是官方明确反对使用的,但旧的C头文件则没有(以保持对C的兼容性)。据说从 Visual C++ .NET 2003 开始,移除了旧的 iostream 库。其实编译器制造商不转载 2009-05-14 18:06:00 · 11333 阅读 · 1 评论 -
const用法详解 (转)
const用法详解 面向对象是C++的重要特性. 但是c++在c的基础上新增加的几点优化也是很耀眼的 就const直接可以取代c中的#define 以下几点很重要,学不好后果也也很严重 const 1. 限定符声明变量只能被读 const int i=5; int j=0; ... i=j; //非法,导致编译错误 j=i; //合法 2. 必须初始化 const in转载 2009-05-21 16:50:00 · 2463 阅读 · 1 评论 -
类的大小——sizeof 的研究(3.虚继承)
看这段代码 class Top { protected: int x; public: Top(int n):x(n){cout<<"Top"<<endl;} virtual ~Top(){} }; class Left:virtual public Top { protected:原创 2009-06-12 17:09:00 · 4739 阅读 · 3 评论