摘要: 题记:初学分布式文件系统,写篇博客加深点印象。GFS的特点是使用一堆廉价的商用计算机支撑大规模数据处理。虽然"The Google File System "是03年发表的老文章了,但现在仍被广泛讨论,其对后来的分布式文件系统设计具有指导意义。然而,作者在设计GFS时,是基于过去很多实验观察的,并提出了很多假设作为前提,这等于给出了一个GFS的应用场景。所以我们自己在设计分布式系统时,一定要注意自己的应用场景是否和GFS相似,不能盲从GFS。GFS的主要假设如下:GFS的服务器都是普通的商用计算机,并不那么可靠,集群出现结点故障是常态。因此必须时刻监控系统的结点状态,当结点 阅读全文
posted @ 2012-10-13 22:15 bizhu 阅读(912) 评论(0) 推荐(0) 编辑
摘要: 内核地址空间分布直接映射区:线性空间中从3G开始最大896M的区间,为直接内存映射区,该区域的线性地址和物理地址存在线性转换关系:线性地址=3G+物理地址。动态内存映射区:该区域由内核函数vmalloc来分配,特点是:线性空间连续,但是对应的物理空间不一定连续。vmalloc分配的线性地址所对应的物理页可能处于低端内存,也可能处于高端内存。永久内存映射区:该区域可访问高端内存。访问方法是使用alloc_page(_GFP_HIGHMEM)分配高端内存页或者使用kmap函数将分配到的高端内存映射到该区域。固定映射区:该区域和4G的顶端只有4k的隔离带,其每个地址项都服务于特定的用途,如ACPI_ 阅读全文
posted @ 2012-10-09 19:59 bizhu 阅读(18868) 评论(0) 推荐(1) 编辑
摘要: 经常使用top命令了解进程信息,其中包括内存方面的信息。命令top帮助文档是这么解释各个字段的。VIRT , Virtual Image (kb)RES, Resident size (kb)SHR, Shared Mem size (kb)%MEM, Memory usage(kb)SWAP, Swapped size (kb)CODE, Code size (kb)DATA, Data+Stack size (kb)nFLT, Page Fault countnDRT, Dirty Pages count尽管有注释,但依然感觉有些晦涩,不知所指何意?进程内存空间正在运行的程序,叫进程。每个 阅读全文
posted @ 2012-10-09 19:49 bizhu 阅读(1291) 评论(0) 推荐(0) 编辑
摘要: linux和os:netstat tcpdump ipcs ipcrm (如果这四个命令没听说过或者不能熟练使用,基本上可以回家,通过的概率较小,这四个命令的熟练掌握程度基本上能体现面试者实际开发和调试程序的经验)cpu 内存 硬盘 等等与系统性能调试相关的命令必须熟练掌握,设置修改权限 tcp网络状态查看 各进程状态 抓包相关等相关命令 必须熟练掌握awk sed需掌握共享内存的使用实现原理(必考必问,然后共享内存段被映射进进程空间之后,存在于进程空间的什么位置?共享内存段最大限制是多少?)c 进程内存空间分布(注意各部分的内存地址谁高谁低,注意栈从高道低分配,堆从低到高分配)ELF是什么? 阅读全文
posted @ 2012-10-08 12:53 bizhu 阅读(5226) 评论(1) 推荐(1) 编辑
摘要: 如今,但凡说精通网络的,第二个意思就是“精通TCP”,事实上,很多自称精通TCP的家伙们只是精通socket接口而已,对TCP行为精通的并不多,笔者也不算精通,但绝对是中等以上水平。如果你真的精通TCP行为,那么本文不读也罢,直接发邮件给我,我们切磋一下,如果只是了解socket接口,那么建议读本文,然后一定再看一下《TCP协议疑难杂症全景解析》0.UDP协议和TCP协议UDP是用户数据报协议的简称,对于分组交换网络,它实际上扮演了传统邮局的角色,而TCP则是扮演了电话运营商以及物流公司的角色,对于分组交换网络而言,UDP要比TCP更加基本一些,可以说,TCP则是实现一种基于流的通信过程,在I 阅读全文
posted @ 2012-10-08 12:33 bizhu 阅读(5154) 评论(0) 推荐(0) 编辑
摘要: 说明:1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的3).针对对象:对TCP已经有了全面了解的人。因为本文不会解析TCP头里面的每一个字段或者3次握手的细节,也不会解释慢启动和快速重传的定义4).除了《TCP/IP详解》(卷一,卷二)以及《Unix网络编程》以及Linux源代码之外,学习网络更好的资源是RFC5).本文给出一个提纲,如果想了解细节,请直接查阅RFC6).翻来覆去,终于找到了这篇备忘,本文基于这篇备忘文档修改。1.网络协议设计ISO提出了OSI分层网络模型,这种分层模型是理论上的, 阅读全文
posted @ 2012-10-08 12:32 bizhu 阅读(656) 评论(0) 推荐(0) 编辑
摘要: 今天有点头晕,躺在床上,睡不着,所以开始思考人生,突然想到了未来系统的发展,便有了下面的构想!!不同意我这个构想的那就当我在胡说算了,哈哈,才大四,一些观点认识得还很疏浅。 我想未来的计算机系统应该朝着简单精小的方向发展,不像现在计算机系统不断的膨胀,开发得越来越大。我的构想是这样的,未来的系统只需一个浏览器就可以,系统是运行在云端,只需游览器连接云计算系统,便可以像现在的计算机一样的操作,上网,聊天。安装软件也安装的云计算机系统里,当然这样需要一个高网速高宽带,这个条件在未来应该不是问题。如果真的像所说的系统只需一个游览器,这样的系统可以做的很小,这样本地的计算机的配置也不需要... 阅读全文
posted @ 2012-10-06 22:57 bizhu 阅读(5093) 评论(17) 推荐(1) 编辑
摘要: 源于网络1.如何判断单链表里面是否有环?设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fast必定先进入环,而slow后进入环,两个指针必定相遇。(当然,fast先行头到尾部为NULL,则为无环链表)程序如下:bool IsExitsLoop(slist *head){ slist *slow = head, *fast = head; while ( fast && fast->next ) { slow = slow->next; fast = fast->next->ne... 阅读全文
posted @ 2012-10-05 14:29 bizhu 阅读(439) 评论(0) 推荐(0) 编辑
摘要: TCP提供一种面向连接的、全双工的、可靠的字节流服务。在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP。TCP的接收端必须丢弃重复的数据。TCP对字节流的内容不作任何解释。对字节流的解释由TCP连接双方的应用层解释。TCP通过下列方式来提供可靠性:应用数据被分割成TCP认为最适合发送的数据块,称为报文段或段。TCP协议中采用自适应的超时及重传策略。TCP可以对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。TCP的接收端必须丢弃重复的数据。TCP还能提供流量控制。TCP报文段格式 源端口和目的端口字段——各占2字节。端... 阅读全文
posted @ 2012-09-26 22:07 bizhu 阅读(2132) 评论(0) 推荐(0) 编辑
摘要: 关于结构体和C++类的内存地址问题今天终于有时间写点 东西了~ 太爽了 *_* 很多人都知道C++类是由结构体发展得来的,所以他们的成员变量(C语言的结构体只有成员变量)的内存分配机制是一样的。下面我们以类来说明问题,如果 类的问题通了,结构体也也就没问题啦。类分为成员变量和成员函数,我们先来讨论成员变量。一个类对象的地址就是类所包含的这一片内存空间的首地址,这个首地址也就对应具体某一个成员变量的地址。(在定义类对象的同时这些成员变量也就被定义了)我们来以一段代码说明问题://类的定义class K{public:K(){k = 12;}~K(){}int k;};//类的使用//...K k 阅读全文
posted @ 2012-09-25 15:59 bizhu 阅读(8649) 评论(2) 推荐(0) 编辑
摘要: 对于动态分配内存,C里使用malloc和free,C++里使用new和delete,这两个操作的主要区别在于new和delete能够自动调用类里的构造函数和析构函数.现在主要讲new出来的对象内存,释放内存使用delete的格式. 学过C++的都知道,如果new一个单一的对象,如int * pInt = new int;释放时要使用delete pInt 格式,不能使用delete [] pInt;而对于new多个对象内存时,如 int *pV = new int[10];释放内存时要使用delete [] pV格式;不能使用delete pV;否则只会释放第一个int类型内存,... 阅读全文
posted @ 2012-09-09 20:13 bizhu 阅读(4700) 评论(17) 推荐(1) 编辑
摘要: 刚走进大四,现在就要开始了各种校招,虽然从大二就开始学了C/C++,但还是不知道是否要走这条路,再加上某某证书没拿到,现在压力这的很大,而且最近这段时间貌似IT行业牺牲了不少精英,感觉真的有点恐怖,我很喜欢写代码,这也是我大学之间的唯一的兴趣,想走这条路,但是还是犹豫不决,很多IT公司已经开始网投了,而且很多公司没来长沙,都到武汉,很悲剧,到时候又得天天往武汉跑,其实也很累的,谁都知道现在付出了辛劳以后工作会好些. 对于现在还没走入社会的我,不知道IT公司的工作情况,是不是都想网上说的那么恐怖? 这不是只有我一个人在考虑的问题,我的很多同学天天都在讨论,我们都不知道外面的社会是... 阅读全文
posted @ 2012-09-08 00:12 bizhu 阅读(1955) 评论(9) 推荐(0) 编辑
摘要: 这篇文章涉及到的都是一些C语言的基础知识,是从一篇英文文章中部分翻译和加入我自己的认识!!!!1. gets()函数Q:下面的代码中隐含着安全问题,能发现吗? 1 #include<stdio.h> 2 int main(void) 3 { 4 char buff[10]; 5 memset(buff,0,sizeof(buff)); 6 7 gets(buff); 8 9 printf("\n The buffer entered is [%s]\n",buff);10 11 return 0;12 }A:问题在于gets()函数,这个函数是接收标准输入的一串 阅读全文
posted @ 2012-09-06 21:41 bizhu 阅读(9819) 评论(10) 推荐(6) 编辑
摘要: 面向对象的三大特性是封装,继承和多态,本文主要介绍C++里的多态特性 在编译器把函数或模板连接生产执行代码的过程中,有两种联编方式,一种是静态联编,另外一种是动态联编, 静态联编是在编译阶段就把函数连接起来,就可以确定调用哪个函数或者模板,而动态联编是指在程序运行时才能确定函数和实现的连接,才能确定调用哪个函数 根据联编的方式我可以把多态(函数多种形态)分成两种,静态多态和动态多态,网上有些资料有四种,多出了宏多态和函数多态,但我个人认为这两种应该属于静态多态 动态多态 主要通过继承和虚函数实现,父类指针或者引用能够指向子类对象,调用子类的虚函数,所有在编译时是无法确定调用哪个虚... 阅读全文
posted @ 2012-08-31 00:01 bizhu 阅读(9302) 评论(1) 推荐(3) 编辑
摘要: //C++中的虚函数的作用主要是实现了多态的机制。关于多态,//简而言之就是用父类型别的指针指向其子类的实例,//然后通过父类的指针调用实际子类的成员函数//每个类都维护着一张虚函数表,//调用虚函数时查看对象是那个类,然后查表//基类可以使用为纯虚函数(virtual void print()=0),//基类就是抽象类,要求子类实现//重载(overload)//1.相同作用域(同类)//2.函数名相同//3.参数不同(参数类型,个数,顺序)//4.virtual关键字可有可无////覆盖(重写override)//1.位于不同作用域(父子类)//2.函数名称相同//3.参数也相同//4.v 阅读全文
posted @ 2012-08-27 23:19 bizhu 阅读(532) 评论(0) 推荐(0) 编辑
摘要: 8月27起持续更新....综合http://www.cnblogs.com/rollenholt/category/300627.htmlhttp://www.thegeekstuff.com/2012/08/c-interview-questions/析构函数http://www.cnblogs.com/daoluanxiaozi/archive/2011/12/09/2281796.html代码实现(strcpy)http://www.chinaunix.net/old_jh/23/25356.html(memcpy)http://liangbing8612.blog.51cto.com/ 阅读全文
posted @ 2012-08-27 22:35 bizhu 阅读(340) 评论(0) 推荐(0) 编辑
摘要: 4. 二叉查找树(BST)Technorati 标记:二叉查找树,BST,二叉查找树合并4.1 BST数据结构定义使用C++语言,如果需要使用BST,那么不用重新造轮子了,C++语言里的map, set等STL容器应该可以满足需求了(虽然STL里这些容器大多是以红黑树作为其底层实现),如果你需要使用小/大根堆(也叫优先队列,特殊的、自平衡的BST),STL也能满足你的需求(可以参考这里:http://www.cnblogs.com/dskit/archive/2009/12/13/1623152.html)。先来看下BST的定义,BST是满足如下3个条件的二叉树:1. 节点的左子树包含的节点的 阅读全文
posted @ 2012-08-19 13:00 bizhu 阅读(18489) 评论(5) 推荐(2) 编辑
摘要: 1. 打靶问题的递归解法Technorati 标记:递归算法,字典法,二分法,打靶问题,日期问题,求幂,多项式求值伦敦奥运会火热进行中,让我们来看个打靶的问题:一个射击运动员打靶,靶一共有10环,求连开10枪打中90环的可能行有多少种?分析:这是一个典型递归求解问题。假设第10枪打x环,则将问题转换为剩下9枪打90-x环的可能有多少种,x的取值范围为[0, 10],根据加法原理,则:10枪打90环的可能 = 第10枪打0环,剩下9枪打90环的可能 + 第10枪打1环,剩下9枪打89环的可能 + 第10枪打2环,剩下9枪打88环的可能+ 第10枪打3环,剩下9枪打87环的可能 + 第10枪打4环 阅读全文
posted @ 2012-08-19 12:56 bizhu 阅读(487) 评论(0) 推荐(0) 编辑
摘要: 排序是计算机算法中非常重要的一项,而排序算法又有不少实现方法,那么哪些排序算法比较有效率,哪些算法在特定场合比较有效,下面将用C++实现各种算法,并且比较他们的效率,让我们对各种排序有个更深入的了解。minheap.h 用于堆排序: 1 //使用时注意将关键码加入 2 #ifndef MINHEAP_H 3 #define MINHEAP_H 4 #include <assert.h> 5 #include <iostream> 6 using std::cout; 7 using std::cin; 8 using std::endl; 9 using std::ce 阅读全文
posted @ 2012-08-12 11:10 bizhu 阅读(2468) 评论(0) 推荐(0) 编辑
摘要: from:http://www.nowamagic.net/librarys/veda/detail/5191. 以下三条输出语句分别输出什么?1 char str1[] = "abc";2 char str2[] = "abc";3 const char str3[] = "abc"; 4 const char str4[] = "abc"; 5 const char* str5 = "abc";6 const char* str6 = "abc";7 cout <& 阅读全文
posted @ 2012-08-12 10:57 bizhu 阅读(3219) 评论(0) 推荐(1) 编辑
摘要: 1、算法思想 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。(1) 分治法的基本思想 分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。(2)快速排序的基本思想 设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为:①分解: 在R[low..high]中任选一 个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pi... 阅读全文
posted @ 2012-08-12 10:36 bizhu 阅读(396) 评论(0) 推荐(0) 编辑
摘要: linux启动序列1、CPU初始化 CPU自身初始化,从某个固定位置(0xfffffff0)取指令并执行,该指令为跳转指令,跳转到BIOS代码的首部。2、装载BIOS BIOS被固化在主板上的一个ROM中,它首先进行自检(POST),随后加载内核引导程序。 POST阶段进行系统硬件的检测,包括内存检测,系统总线检测等。3、读取MBR POST之后,BIOS会读取启动设备的第一个扇区(MBR),即512字节的信息,MBR保存了内核引导程序的开始部分,BIOS将其加载到内存并且执行。 MBR中的主引导程序,包含了446字节的程序代码和64字节的分区表。4、加载系统内核 执行MBR中的主引导程序程序 阅读全文
posted @ 2012-08-12 00:31 bizhu 阅读(400) 评论(0) 推荐(0) 编辑
摘要: #include <Windows.h> //必须放在mysql.h前#include <WinSock.h>#include "mysql.h"#pragma comment(lib, "ws2_32.lib") //必须的int _tmain(int argc, _TCHAR* argv[]){ MYSQL * con ; char hostName[] = "localhost"; char dbName[] = "test"; char dbuser[] = "root&q 阅读全文
posted @ 2012-08-07 16:58 bizhu 阅读(676) 评论(0) 推荐(1) 编辑
摘要: 1.auto_ptr和shared_ptr只是适合用于管理heap(堆)上的内存,即动态分配的内存,但不是所有的资源都在heap上所有这两个智能指针并不适合用于资源管理,所有需要建立自己的资源管理类2.lock和unlock管理互斥对象Mutex的指针void lock(Mutex *pm)void unlock(Mutex *pm)希望在构造函数时调用lock(),在析构时调用unlock(),所有构建一个类class MagMutex{public: MagMutex(Mutex *pm):pClassM(pm) { lock(pClassM); } ~MagMutex(M... 阅读全文
posted @ 2012-08-06 23:02 bizhu 阅读(215) 评论(0) 推荐(0) 编辑
摘要: 1.管理动态分配内存void TestFun(){ int *pval = new int(0); .... //此处省略一万代码... delete pval; pval = NULL; //这一边最好有,不然pval相当于执行一块被释放内存的空间,也就是野指针} 这里涉及到动态分配内存使用后回收问题,虽然上面函数中使用到delete,但不一定能被执行到,在代码"...."中如果有分支(if,while, switch)中有return或者中途抛出异常,函数都会中断,delete不会被执行,这就容易造成内存泄露,如果解决这个问题,可以使用"智能指针". 阅读全文
posted @ 2012-07-30 14:58 bizhu 阅读(215) 评论(0) 推荐(0) 编辑
摘要: C++的auto_ptr, auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理。1 构造函数与析构函数auto_ptr在构造时获取对某个对象的所有权(ownership),在析构时释放该对象。我们可以这样使用auto_ptr来提高代码安全性:int* p = new int(0);auto_ptr<int> ap(p);从此我们不必关心应该何时释放p, 也不用担心发生异常会有内存泄漏。这里我们有几点要注意:1) 因为auto_ptr析构的时候肯定会删除他所拥有的那个对象,所有我们就要注意了,一个萝卜一个坑,两个auto_ptr不能同时拥有同一个对象。像这样 阅读全文
posted @ 2012-07-29 21:55 bizhu 阅读(3674) 评论(0) 推荐(0) 编辑
摘要: 1.在类里涉及到对象拷贝的函数要复制类里每一个成分copy构造函数以及copy assignment操作符如class Test{private: string name;public: Test(const Test& rhs):name(rhs.name) {} Test& operator = (const Test& rhs) { name = rhs.name; return this; }};这样如果类里再添加一个成员变量时,就得需要修改这两个函数,不然新成员不会被拷贝的新对象中,而且编译器一般不会报错2.在继承中,注意base类的拷贝class derve 阅读全文
posted @ 2012-07-29 10:29 bizhu 阅读(330) 评论(0) 推荐(0) 编辑
摘要: 1.在operator = 中,有可能自己给自己赋值 a[i] = a[j] //潜在自我赋值, 当i = j时 *py = *px //潜在自我赋值 当py和px指向同一个地址时 2.自我赋值的不安全性 class Test{...}; class ManTest { ManTest& operator = (const ManTest& rhs) { delete p; p = new Test(*rhs.p); return *this; } private: Test *p; }; 安全问题:当*this和... 阅读全文
posted @ 2012-07-27 23:49 bizhu 阅读(234) 评论(0) 推荐(0) 编辑
摘要: 条款九跳过了,里面的内容和我看到的内容有些出入,所以跳过条款十 令operator = 返回一个 reference to *this赋值操作=有时候用于连续的赋值操作,为了类能够连续赋值,并且高效完成可以使用 reference,重载操作符时,令返回值为reference *thisclass Test{ public: Test& operator = (const Test& obj) { ...... return *this; }}可以使用所有的相关的运算操作符 阅读全文
posted @ 2012-07-27 16:47 bizhu 阅读(176) 评论(0) 推荐(0) 编辑
摘要: 1.最好是不要让析构函数吐出异常,如果析构函数吐出异常而且程序没有结束,这会导致不明确的行为 当异常抛出时,本身函数就结束,函数里的后续处理就不会执行,这要是发生在析构函数里,可能因为 异常而导致后续的数据释放没有完成,造成内存泄露class Test{public: Test(){ p = new char[4]; } ~Test() { throw("exception"); //退出析构函数 delete p; //不会执行 }private: char *p;}; 两种不是很好的解决方法 (1) 结束整个程序:Test *p = new Test; ... 阅读全文
posted @ 2012-07-24 01:02 bizhu 阅读(307) 评论(0) 推荐(0) 编辑
摘要: 在 c++ 98 里面只有一种智能指针,就是 std::auto_ptr,因为具有唯一所有权的特征,所以限制了它的使用范围,比如你无法在容器中使用它。而我们知道 stl 容器是值语义的,如果不能用智能指针管理的话,只有两种办法来使用。一种是类似这样:std::vector<std::string> names;names.push_back("cyberscorpio");std::string name("news818");names.push_back(name);每次向容器中添加内容的时候,实际上产生了该内容的另一份拷贝,对于简单的内 阅读全文
posted @ 2012-07-23 10:20 bizhu 阅读(3922) 评论(0) 推荐(0) 编辑
摘要: 一、定义函数指针typedefvoid(*F)(int); voidprint1(intx){ cout<<x; }intmain(){ F a; a = print1; (*a)(20); }二、简单类型替换typedefintI; intmain(){ I a; a = 10; //a = "a";//false cout<<a; }三、定义数组类型typedefintA[3]; intmain(){ A b = {3,4,5}; cout<<sizeof(b); }总结问题:typedef int[8] intarr8;//erro 阅读全文
posted @ 2012-07-22 10:43 bizhu 阅读(323) 评论(0) 推荐(0) 编辑
摘要: mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。 在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。 下面是一个小例子:class ClxTest{public: void Output() const;};void ClxTest:... 阅读全文
posted @ 2012-07-22 10:38 bizhu 阅读(266) 评论(0) 推荐(0) 编辑
摘要: ①一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。(可以理解为每次使用该变量时都要从内存中读取,而不是从寄存器中读取)关于优化:在单任务下,在一个函数体内,如果两次读取变量间语句没有对变量的值进行修改,那么编译器就会进行优化。由于寄存器速度快于RAM,所以一般会减少存取外部RAM。②该变量的适用情况:1)并行设备的硬件寄存器(如:状态寄存器)2)一个中断服务子程序中会访问到的非自动变量(Non-automatic variables 阅读全文
posted @ 2012-07-22 10:24 bizhu 阅读(723) 评论(0) 推荐(0) 编辑
摘要: 1.使用keytool申请获取MD5值 1.1 找到你的debug.keystore Windows Vista/7: C:\Users\<username>\.android\debug.keystore Windows XP: C:\Documents and Settings\<user>\.android\debug.keystore OS X and Linux:~/.android/debug.keystore 1.2 使用cmd切换到debug.keystore所在的目录 我的系统是windows 7 所在文件夹:C:\Users\Work\.androi 阅读全文
posted @ 2012-07-21 12:48 bizhu 阅读(9653) 评论(0) 推荐(2) 编辑
摘要: 1.如果基类中的成员函数是virtual类型的,其继承类中相应的函数也是virtual类型,并且基类对象的引用指向继承类对象时, 基类就可以调用继承类函数,否则调用的是基类函数class base{public:virtual void fun(){ printf("base fun");}};class derived:public base{public:void fun(){ printf("derived fun");}};derived der;base &b = der; //或者base *b = &der;b.fun(); 阅读全文
posted @ 2012-07-20 21:09 bizhu 阅读(1402) 评论(0) 推荐(0) 编辑
摘要: 1.可以将要拒绝的编译器会生成的函数自己定义为private的就可以,这样外部就无法调用这些函数,同时, 为了防止内部函数调用,可以只是声明函数,而不定义函数 如,拒绝使用copy构造函数 class Test { private: Test(const Test&); //可以不明确写出参数 }; 这样成员函数或者friend函数调用时,因为没有定义而在链接时报错,这样就可以提前发现. 2.可以定义一个base class,然后将要继承的函数放到private里,要拒绝自动生成的类可以继承该类 阅读全文
posted @ 2012-07-20 16:25 bizhu 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 1.如果自己没有声明,编译器会自动声明一个default构造函数,一个copy构造函数,一个copy assignment操作符和一个析构函数. 自动声明的这些函数都是public并且inline的,这些函数是在需要时编译器才声明的.class Test{};Test T1; //default构造函数Test T2(T1); //copy构造函数T2 = T1; //copy assignment操作符2.编译器产生的析构函数是no-virtual的,除非继承的父类的析构函数是virtual的3.如果自己声明了上面那四个函数,编译器不会再生成相应的函数.class Test{public:. 阅读全文
posted @ 2012-07-20 16:24 bizhu 阅读(283) 评论(0) 推荐(0) 编辑
摘要: 三种访问权限public:可以被任意实体访问protected:只允许子类及本类的成员函数访问private:只允许本类的成员函数访问三种继承方式public 继承protect 继承private 继承组合结果基类中 继承方式 子类中public & public继承 => publicpublic & protected继承 => protectedpublic & private继承 = > privateprotected & public继承 => protectedprotected & protected继承 => protectedprotecte 阅读全文
posted @ 2012-07-20 16:09 bizhu 阅读(9397) 评论(1) 推荐(1) 编辑
摘要: 1、变量的初始化 int a = 0; int b; std::cin >> b; 对于类的成员变量,可使用构造函数 class Test { public: Test(int aVal,int bVal):a(aVal),b(bVal) {} //初始化 private: int a,b; } 注意区分初始化和赋值 Test(int aVal,int bVal){ a = aVal; b = bVal;} //赋值 2.在初始化的初值列表中,初始化的顺序是按照声明的顺序初始化,而不是初值列表的顺序3.若要保证一个... 阅读全文
posted @ 2012-07-18 21:03 bizhu 阅读(185) 评论(0) 推荐(0) 编辑