Efftive C++ notes

问题描述

1.公有继承意味着是“是一个”,对于基类的任何都适合,然而这是一种理想话,比如说鸟会飞,但企鹅不会飞啊。2.纯虚函数:具体类中重新声明,抽象类中往往没有定义。这样做的目的,使子类仅仅继承父类的接口(而没有继承其接口的实现)注:为纯虚函数提供定义也是有可能的,也就是可以为纯虚函数提供实现,但调用它的唯一方法是通过类名完整地指明是哪个调用。即Shpe*ps1=newRectangle;ps1->Shape::draw();3.简单虚函数(非纯),使派生类继承函数的接口和缺省实现。这样做很危险。竟然试图让ModelC对象如同ModelA或ModelB那样飞行。这种行为可不能换来旅客对你的信任!窍门在于切断虚函数的接口和它的缺省实现之间的联系--纯虚函数必须在子类中重新声明,但它还是可以在基类中有自己的实现4.非虚函数的目的在于,使派生类继承函数的接口和强制性实现,表示一种特殊性上的不变性,所以它决不能在子类中重新定义5.事实上是:几乎任何一个作为基类使用的类都有虚函数6.如果写类D时重新定义了从类B继承而来的非虚函数mf,D的对象就可能表现出精神分裂症般的异常行为。也就是说,D的对象在mf被调用时,行为有可能象B,也有可能象D,决定因素和对象本身没有一点关系,而是取决于指向它的指针所声明的类型。引用也会和指针一样表现出这样的异常行为7.虚函数是动态绑定而缺省参数值是静态绑定的8.对象的动态类型是由它当前所指的对象的类型决定的。即,对象的动态类型表示它将执行何种行为。9.决不要重新定义继承而来的缺省参数值,虚函数是动态绑定的,但缺省参数是静态绑定的。这意味着你最终可能调用的是一个定义在派生类,但使用了基类中的缺省参数值的虚函数:10.对于一个虚函数,编译器可以根据所使用对象的类型来保证正确的函数调用11.“有一个”、“用...来实现”12.类型T影响类的行为吗?如果T不影响行为,你可以使用模板。如果T影响行为,你就需要虚函数,从而要使用继承。13.·当对象的类型不影响类中函数的行为时,就要使用模板来生成这样一组类。·当对象的类型影响类中函数的行为时,就要使用继承来得到这样一组类。真正消化了以上两点的含义,你就可以在设计中游刃于继承或模板之间。14.如果两个类之间的继承关系为私有,编译器一般不会将派生类对象(如Student)转换成基类对象(如Person)。Student类从Person类公有继承,为了使某个函数成功调用,编译器可以在必要时隐式地将Student转换为Person。15.私有继承意味着"用...来实现"。如果使类D私有继承于类B,这样做是因为你想利用类B中已经存在的某些代码,而不是因为类型B的对象和类型D的对象之间有什么概念上的关系。16.尽可能地使用分层,必须时才使用私有继承17.如果实例化一个模板一百次,你就可能实例化了那个模板的代码一百次。例如Stack模板,构成Stack<int>成员函数的代码和构成Stack<double>成员函数的代码是完全分开的。有时这是不可避免的,但即使模板函数实际上可以共享代码,这种代码重复还是可能存在。这种目标代码体积的增加有一个名字:模板导致的"代码膨胀"。这不是件好事。18.明智使用私有继承假如有个栈A,需要压入void*指针,即可以压入不同类类型的指针,这里会遇到这个问题,需要你压入的类型不同,如有时候压入int的,有时候压入char类型的。如果采用实现来规避这个问题,但有时候,有人误操作使用了栈A进行压入操作,这是有可能。为了避免这一点,我们可以让栈A的构造函数设为protected,无法构造这个类A的对象了,避免有个进行对它操作了,那我们怎么解决不同类型压栈问题呢,这里就用私用继承了,在一些接口类中,要求改变基类的实现,采用私有继承,19.明智地使用内联,内联函数的基本思想在于将每个函数调用以它的代码体来替换可能会增加整个目标代码的体积,内联造成的代码膨胀也可能会导致不合理的页面调度行为过多的内联还会降低指令高速缓存的命中率,从而使取指令的速度降低,因为从主存取指令当然比从缓存要慢。20.文件间的编译依赖性降至最低接口和实现的分离将大大节省重新编译和链接所花的时间21.分离的关键在于,"对类定义的依赖"被"对类声明的依赖"取代了22.为了降低编译依赖性,我们只要知道这么一条就足够了:只要有可能,尽量让头文件不要依赖于别的文件;如果不可能,就借助于类的声明,不要依靠类的定义。由于C++没有明确的将接口和实现分离,文件之间的编译依赖关系很大,如果有一个文件代码发生变化,则可能影响其他文件,乃至整个项目。因此,将对象实现细目隐藏于一个指针背后的目的,我们可以设计一个接口类。一个实现类,负责接口的实现23.提供一个完整、最小的接口,用户就可以做任何他们想做的事,但类的接口不必再那样复杂24.成员函数和非成员函数最大的区别在于成员函数可以是虚拟的而非成员函数不行25.构造函数没有声明为explicit的情况下才会这样,因为explicit构造函数不能用于隐式转换26.避免对指针和数字类型重载27.无数现有的C++代码都依赖于使用了多年的伪标准库中的功能,例如,声明在<iostream.h>,<complex.h>,<limits.h>等头文件中的功能28.·旧的C++头文件名如<iostream.h>将会继续被支持,尽管它们不在官方标准中。这些头文件的内容不在名字空间std中。·新的C++头文件如<iostream>包含的基本功能和对应的旧头文件相同,但头文件的内容在名字空间std中。(在标准化的过程中,库中有些部分的细节被修改了,所以旧头文件和新头文件中的实体不一定完全对应。)·标准C头文件如<stdio.h>继续被支持。头文件的内容不在std中。·具有C库功能的新C++头文件具有如<cstdio>这样的名字。它们提供的内容和相应的旧C头文件相同,只是内容在std中。29.尽量使用初始化而不要在构造函数里赋值,从纯实际应用的角度来看,有些情况下必须用初始化。特别是const和引用数据成员只能用初始化,不能被赋值。

解决方案

解决方案二:
一个问题: 我尝试封装HWND来作为子窗口控件的基类在CommonControl中我写了这样一句话virtualboolonCreate(void)=0;在TreeControl(继承自CommonControl)中我重写了onCreate函数boolonCreate(LPCSTRp_hWndClass,LPCSTRp_szCaption,HWNDp_hWndParent,HINSTANCEp_hInstance,int32_tp_posx,int32_tp_posy,int32_tp_height,int32_tp_width){}神奇的是代码编译通过了,我不解 纯虚函数 其子类的实现 可以参数不同?那不就是 函数重载 而不是函数重写?纯虚函数这样也行?

时间: 2024-10-26 22:44:47

Efftive C++ notes的相关文章

ASP能否调用notes的数据

数据 试试吧 <% On error resume next Set session=CreateObject("Notes.NotesSession") Set db=session.GetDatabase("","test4.nsf") Set doc=db.CreateDocument doc.Form="Main" doc.Subject="subject" doc.Body="bo

解并实现 IBM Lotus Notes 的本地邮件副本

复制所提供的灵活性和自由性是使用 IBM Lotus Notes 的无与伦比的优点.许多组织选择在全天候的基础上利用这个功能强大的特性,并将其用户配置为使用 Notes 数据库(包括邮件数据库)的本地副本. 除了上述文章中所讨论的要点外,Lotus Notes/Domino 还添加了其它特性,从而使实现本地邮件副本更具吸引力.本文讨论了这些新增的增强功能,并推荐了一些设置本地邮件副本的方法.在解释本地副本模型和(在您的基础设施内建立此环境相关的)技术细节之前,让我们先来看一个模型的适用性示例.

asp模仿 Lotus Notes 的界面程序

程序 <%'仿 Lotus Notes 的界面程序'作者:塞北的雪'创作日期:2002年3月'修改日期:2005年3月'为了安全和共享的方便,将其中asp程序的标记改成中文字符,使用时可以批量替换回%〉 <html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><style>.tHeader{font-weigh

The C# Programming Language Notes

1,不彻底的abstract 即使是abstract class,也不能对实现的接口的某个成员视而不见,即下面这样是不允许的: interface in_one{ void A();} abstract class base_one : in_one{ } 这一点上还是Java方便,不管C#的初衷是什么 2,out参数与指针的指针 out子类不能转化为out基类,如果允许转换的化,将无法保证类型安全性:即out参数相当于指针的指针,而父类的指针与子类的指针是没有继承关系的,所以不能转化 (The

使用Ajax操纵Lotus Notes文档

使用 Ajax,您可以轻而易举地即时向用户提供反馈,而不必再耗费大量时间重新载入用户所使用的页面.本文将带领您发现视图和代理如何帮助您构建 Ajax 驱动的应用程序,并教您如何定义一个 API,使客户机和 Domino 服务器协作. 每个人都曾经使用过某种类型的 To Do 列表系统.此类系统通常包含一些必须快速.易用的数据小段.To Do 列表也是演示 Asynchronous JavaScript and XML(Ajax)技术与 Lotus Domino 的完美范例,本文将为您介绍如何使用

简述IBM Notes 9.0在 Mountain Lion 操作系统上的安装新特性

IBM Notes 9.0 版本是 Notes 产品历史上的一个重要里程碑.除了采用新的品牌名称(由 Lotus Notes 到 IBM Notes),IBM Notes 9.0 版本中还带来了崭新的用户界面和许多新的功能特性,增加了对一些重要新平台版本的支持,而 Mountain Lion(OS X 10.8) 就是其中之一. 本文就将着重介绍 IBM Notes 9.0 在 Mountain Lion 上安装方面的新特性. 1. IBM Notes 9.0 全新安装的特性 用户安装界面的变化

打开Lotus Notes时收到错误信息: Notes Directory inaccessible

问题:打开Lotus Notes时收到错误信息: Notes Directory inaccessible 原因:权限导致 解决方法:google了一下,到了IBM Lotus的官方KB,看了几条,大部分说是admin权限的原因.于是把Notes文件夹赋予user完全控制的权限,再试,打开了. 查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Office/soft/

使用IBM Lotus Notes/Domino V8邮件收回功能

简介:你希望使用邮件收回功能,现在使用 IBM Lotus Notes/Domino V8 您就能够收回邮件消息.通 过本文了解邮件收回(Message Recall)功能的工作方式,以及如何配置.控制和部署该功能. 邮件消息收回功能是人们最需要的 IBM Lotus Notes/Domino V8 功能之一.默认情况下,服务器和客 户机将启用该功能,允许您收回被错误发送的邮件消息.本文将研究邮件收回功能的工作方式,讨论如何 配置和控制该功能,将涵盖设计和部署该功能中的一些细节. 邮件收回是如何

简介Notes和Domino的历史

简介:Notes 和 Domino 源自 Ray Ozzie.Tim Halvorsen 和 Len Kawell 的研究工作,最初是伊利 诺斯州立大学的 PLATO Notes,后来是 DECNotes.Lotus 的缔造者 Mitch Kapor 认识到了 Ozzie 的协 作项目的巨大潜力,其开发历史就开始了. 您可能料想得到,像 IBM Lotus Notes 和 Domino 这样复杂而成功的软件肯定拥有漫长而丰富多彩的 历史.从某些方面来说,这段历史也反映了计算机工业本身的发展:PC