![个人头像照片](https://ucc.alicdn.com/avatar/img_549ec0fb89fbd36f61d148fccaa340bb.jpg)
暂无个人介绍
1、当函数的返回值必须与形参表中所用的所有类型都不同时,有必要覆盖模板实参推断机制,显式指定为模板形参所用的类型或值。 示例 sum(static_cast(s), i); 2、指定返回类型的一种方式是引入第三个模板实参: 示例 template T1 sum...
1、问题描述:给定n个数,求相邻的k个数之和为最大。要求给出复杂度较小的一种算法 再解决这个问题前,先了解一下类似的常见问题。 2、给定一串数字(可正可负的int,放在数组Num里),要求找到起始位置start和终止位置end,使得从start位置到end位置的所有数字之和最大,返回这个最大值max。
1、所谓泛型编程就是以独立于任何特定类型的方式编写代码。使用泛型程序时,我们需要提供具体程序实例所操作的类型或值。 在泛型编程中,我们所编写的类和函数能够多态地用于跨越编译时不相关的类型。
1、在继承情况下,派生类的作用域嵌套在基类作用域中。正是这种类作用域的层次嵌套使我们能够直接访问基类的成员。 2、与基类成员同名的派生类成员将屏蔽对基类成员的访问。可以使用作用域操作符访问被屏蔽的基类成员。
1、每个派生类对象包含一个基类部分。因此派生类对象也是基类对象。可以将派生类对象的引用转换为基类子对象的引用,同理指针。 2、没有从基类引用(或基类指针)到派生类引用(或派生类指针)的(自动)转换。
1、继承,动态绑定,数据抽象一起成为面向对象编程的基础。 2、模板使我们能够编写独立于具体类型的泛型类和泛型函数。在C++中,用类进行数据抽象,用类派生从一个类继承另一个类:派生类继承基类的成员。
1、转换分为到类类型与从类类型的转换两种。到类类型的转换:通过转换构造函数;从类类型的转换:转换操作符。 2、常用16个操作符:5个算术操作符(+、-、*、/、%)及其对应的复合赋值操作符,4 个关系操作符(=),以及相等操作符(==、!=)。
1、自增操作符和自减操作符 为了与内置类型一致,前缀操作符应返回被增量或减量对象的引用;后辍式操作符应返回旧值(不是引用)。后辍式操作符函数接受一个额外的(即无用的)int型形参。 示例 #include "iostream" #include "stdio.
1、除了函数调用符之外,重载操作符的形参数目(包括成员函数的隐式this指针)与操作符的操作数目相同。函数调用操作符可以接受任意数目的操作数。 表1 可重载的操作符名 + - * / % ^ & | ...
1、格式化输入函数scanf 用法: scanf("格式串" ,地址1,地址2,···); 1)格式符 syntax: %[*][width][h|l|L]type (1) [h|l|L]type d 以十进制有符号整数形式转换输入数据 i ...
1、C语言中,非零值为真,真用1表示;零值为假,假用0表示。 2、转义字符参考: \a 蜂鸣,响铃 \b 回退:向后退一格 \f 换页 \n 换行 \r 回车,光标到本行行首 ...
1、sscanf()的使用技巧: int sscanf(const char *buffer, const char *format,……); 从缓冲区中按指定格式输入字符,buffer为数据缓冲区。
1、一般采取三种方法 1)指针成员采取常规指针型行为。这样的类具有指针的所有缺陷但无需特殊的复制控制。 2)类可以实现所谓的“智能指针”行为。指针所指向的对象是共享的,但类能够防止悬垂指针。 3)类采取值型行为。
1、显式构造函数 复制构造函数是一种特殊构造函数,具有单个形参,该形参(常用 const 修饰)是对该类类型的引用。当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式使用复制构造函数。当将该类型的对象传递给函数或函数返回该类型的对象时,将隐式使用复制构造函数。
1、构造函数初始化式只在构造函数的定义中而不是声明中指定。 2、从概念上讲,可以认为构造函数分两个阶段执行:(1)初始化阶段;(2) 普通的计算阶段。计算阶段由构造函数函数体中的所有语句组成。不管成员是否在构造函数初始化列表中显式初始化,类类型的数据成员总是在初始化阶段初始化。
1、static成员函数没有this形参,它可以直接访问所属类的static成员,但不能直接使用非static成员。 2、可以通过作用域操作符,对象,引用,指针来调用static成员。 3、在类外给static成员数据赋值,或定义成员函数时不必要再指定static。
1、成员可以是数据,函数或类型别名(typedef定义的)。 2、const必须同时出现在声明和定义中。 3、重载的成员函数和普通函数应用相同的规则:两个重载成员的形参数量和类型不能完全相同。也可以根据const来定义。
1、三种迭代器 1)插入迭代器(insert iterator):迭代器适配器,与容器绑定在一起,实现在容器中插入元素的功能。形参为一个迭代器和一个指向容器的引用。 • back_inserter,创建使用 push_back 实现插入的迭代器,形参为指向容器的引用的迭代器适配器。
1、泛型,指的是他们可以操作在多种容器类型上-不但可作用于 vector 或 list这些标准库类型,还可用在内置数组类型、甚至其他类型的序列上。自定义的容器类型只要与标准库兼容,同样可以使用这些泛型算法。
1、map 和 set 容器中,一个键只能对应一个实例。multimap和multiset类型允许一个键对应多个实例。其支持的操作分别与map和set的操作相同,只有一个例外,multimap不支持下标运算。
1、关联容器和顺序容器的本质差别在于:关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。 2、map 的元素以键-值(key-value)对的形式组织:键用作元素在 map 中的索引,而值则表示所存储和读取的数据。
1、size 指容器当前拥有的元素个数;而 capacity 则指容器在必须分配新存储空间之前可以存储的元素总数。而reserve操作则告诉vector容器应该预留多少元素的存储空间。 2、通常来说,除非找到选择使用其他容器的更好理由,否则vector 容器都是最佳选择。
1、string操作 string s; 定义一个新的空 string 对象,命名为 s string s(cp); 定义一个新的 string 对象,用 cp 所指向的(以空字符null 结束的)C 风格字符串(可以为字符串或字符数组,但是需以null结束)初始化该对象。
1、所谓泛型,指的是两个方面:这些算法可作用于各种不同的容器类型,而这些容器又可以容纳多种不同类型的元素。 2、顺序容器:将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素。 顺序容器 vector 支持快速随机访问 list ...
1、文件的输入输出 由于历史原因,IO 标准库使用 C 风格字符串而不是 C++strings 类型的字符串作为文件名。 如果要把fstream对象与另一个不同的文件关联,则必须先关闭(close)现在的文件,然后打开(open)另一个文件。
1、如果两种类型存在继承关系,则可以说一个类“继承”了其父类的行为-接口。IO 类型在三个独立的头文件中定义:iostream 定义读写控制窗口的类型, fstream 定义读写已命名文件的类型,而 sstream 所定义的类型则用于读写存 储在内存中的 string 对象。
1、对于字符串,最常见的散列算法之一就是:逐个把字节加到已经构造的部分散列值的一个倍数上。乘法能把新字节在已有的值中散开来。这样,最后结果将是所有输入字节的一种彻底混合。根据经验,在对ASCII串的散列函数中,选择31和37作为乘数是很好的。
1、case 标号必须是整形常量表达式。 对于switch结构,只能在它的最后一个case标号或default标号后面定义变量;制定这个规则主要是为了避免代码跳过变量的定义和初始化的情况。可以为某个特殊的case定义变量通过块语句。
1、数组的维数必须用大于等于1的常量表达式定义:只能包含整形字面值常量,枚举常量,或用常量表达式初始化的整形const对象。 数组下标的类型是size_t,是cstddef中定义的与机器相关的无符号整形。
1、C++中,每个表达式都会产生一个结果,通常是将操作符作用到其操作数所产生的值。当操作符是输出操作符时,结果是左操作数的值。也就是说,输出操作返回的值是输出流本身。 2、注释对不可嵌套。指/**/ 3、我们使用istream对象作为while的测试条件时,结果是测试流的状态,如果是流是有效的(输入的是有效字符或没有到达文件结尾),则测试成功。
1、组件是对数据和方法的简单封装。 2、Tip of the day. 3、ActiveX control 的三个接口也有类似性质: ■ property:相当于C++ 类别的成员变量 ■ method:相当于C++ 类别的成员函数 ■ event:相当于Windows 控制组件发出的notifi...
什么是Wizard?简言之,就是一个动态链接函数库。可以自己设计一些向导,如有名的DDK Project。 [1,P571]有更多介绍。 参考 [1] 深入浅出MFC
一、基本概念 1、模块:一段可执行的程序(包括EXE和DLL),其程序代码、数据、资源被加载到内存中,由系统建置一个数据结构来管理它,就是一个模块。这里所说的数据结构,名为Module Database(MDB),其实就是PE格式中的PE表头,可以从WINNT.H 档中找到一个IMAGE_NT_HEADER 结构,就是它。
1、主要还是窗口的拆分。[1,P543] 2、ASCII->HEx n = forIt[i] & 0x00FF; 3、要具有打印预览功能(View),需要改写三个函数: virtual BOOL OnPreparePrinting(CPrintInfo* pInfo); virtual void ...
1、同一份Document的多个views,在Document的一个view改变了后,如何同步其它view呢? 让所有的Views 同步更新资料的关键在于两个函数: 1)CDocument::UpdateAllViews:这个函数会巡访所有隶属同一份Document的各个Views,找到一个就通知一个,而所谓「通知」就是调用其OnUpdate 函数。
关于对话框的讨论,[2,3]中校为丰富。 DDX,是把对话框类别中的成员变量与对话框中的控制组件产生关联,于是 当对话框结束时,控制组件的内容会自动传输到这些成员变量上。 DDV,是允许我们设定对话框控制组件的内容类型以及资料(数值)范围。
Message Mapping and Command Routing 1、MFC把消息三大类: 1)命令消息(WM_COMMAND):凡由UI 对象产生的消息都是这种命令消息,可能来自菜单或加速键或工具栏。
1、型录网就是CRuntimeClass组成的一个链表。应用程序使用DECLARE_SERIAL,IMPLEMENT_SERIAL两个宏,就获得文件读写以及动态创建两种机制。 2、Serializable的必要条件 欲让一个对象有Serialize能力,它必须派生自一个Serializable类,一个类意欲成为Serializable,必须有下列五大条件: 1)从CObject派生下来,如此以来可保有RTTI、Dynamic Creation等机能。
1、由于CDocument派生自CObject,所以它就有了CObject所支持的性质,如RTTI,动态创建,文件读写(Serialization)。又由于它也派生自CCmdTarget,所以它可以接收来自菜单或工具栏的WM_COMMAND消息。
1、Document/View是MFC进化为Application Framework的灵魂。在MFC中,可以把Document简单想像成数据,MFC的CDocument已经负责处理数据的类。同时,CDocument搭配了另一个重要的类CView。
1、需要的函数库 Windows C Runtime函数库 DLL Import函数库 MFC 函数库[1,P264] 2、传统SDK程序中WinMain所完成的工作现在由CWinApp的三个函数完成: virtual BOOL InitApplication();//内部管理初始化工作 virtual BOOL InitInstance();//创建窗口 virtual int Run();//分发消息 WinMain只是扮演驾驭它们的角色。
1、Application Framework是一个完整的程序模型;是一组合作无间的对象,彼此藉消息的流动而沟通,并且互相调用对方的函数以求完成任务。 2、“整厂整线”最重要最有价值的是各单元之间的流程与控制。
ATL(ActiveX Template Library),关于ActiveX控件的开发设计,可参考ActiveX Control Inside Out。 LIB MFC的静态函数库 1、开发流程图示 Resource Editor 做出的各种资源与程序代码间通过ClassWizard来搭桥连接。
书中讲这了RTTI,Dynamic Creation,Persistance,Message Mapping,Message Routing等的实现。[1] 尤其是其中的类别型录网的建立过程值得学习。
一、一些基本概念 1、this指针 Class Crect { public: void setcolor(int color){m_color=color;} } ; 编译后为: Class Crect { public: void setcolor(int color,(Crect*)this){this.m_color=color;} } 2、如果基类和派生类都定义了“相同名称之成员函数”,那么通过对象指针调用成员函数时,到底调用哪一个函数,必须视指针的原始类型而定。
一、基本概念 1、线程是CPU的调度单位。 2、核心对象(kernel object)是系统的一种资源,系统对象一旦产生,任何应用程序都可以开启并使用该对象。系统给予核心对象一个计数值作为管理之用。 前三者用于线程的同步,file-mapping用于内存映射文件。
一、基本概念 1、Windows程序的本质是基于消息的事件驱动。 Windows程序分为程序代码和UI资源两大部分。如图所示,资源的实际内容是二进制代码,借助各种工具产生。 在32位操作系统中不再有small/medium/large等内存模式之分。
1、64位操作系统与32位操作系统最大的不同在于寻址空间的大小,32位操作系统使用32位数据来表示内存地址,因此有232 (4GB)的可用空间,而64位操作系统可以使用16TB的内存地址空间。在64位操作系统下,指针和基本数据类型(int)所引用的空间是64位的。
Windows系统具有很完善的安全和认证机制,称作访问控制机制。程序的执行主体(线程)在访问对象(文件、事件等)时,系统会根据线程的“权限”和线程需要访问的对象所具有的访问控制列表(ACL)中的“安全描述符”是否匹配来进行认证,决定一个线程是否可以操作一个对象。
关于驱动和内核的学习介绍,[2]中较为详细。这里只简述。 应用程序可以将设备驱动程序加载入内核。可以对已经加载了的设备驱动程序发送请求,进行控制或与内核程序进行通信,传输数据。 设备管理[1] 列举设备 SetupDiCreateDeviceInfoList函数创建一个空的设备信息列表。