函数声明

<C++实践系列>C++中的模板(template)

馋奶兔 提交于 2019-12-07 13:04:31
1. 简介 模板是C++在90年代引进的一个新概念,原本是为了对容器类(container classes)的支持 [1] ,但是现在模板产生的效果已经远非当初所能想象。 简单的讲,模板就是一种参数化(parameterized)的类或函数,也就是类的形态(成员、方法、布局等)或者函数的形态(参数、返回值等)可以被参数改变。更加神奇的是这里所说的参数,不光是我们传统函数中所说的数值形式的参数,还可以是一种类型(实际上稍微有一些了解的人,更多的会注意到使用类型作为参数,而往往忽略使用数值作为参数的情况)。 举个常用的例子来解释也许模板就从你脑袋里的一个模糊的概念变成活生生的代码了: 在C语言中,如果我们要比较两个数的大小,常常会定义两个宏: #define min(a,b) ((a)>(b)?(b):(a)) #define max(a,b) ((a)>(b)?(a):(b)) 这样你就可以在代码中: return min(10, 4); 或者: return min(5.3, 18.6); 这两个宏非常好用,但是在C++中,它们并不像在C中那样受欢迎。宏因为没有类型检查以及天生的不安全(例如如果代码写为min(a++, b--);则显然结果非你所愿),在C++中被inline函数替代。但是随着你将min/max改为函数,你立刻就会发现这个函数的局限性 ——

MFC的消息映射

走远了吗. 提交于 2019-12-07 10:44:13
我觉得消息映射机制关键是几个宏的理解和熟悉。 对于SDK中的switch..case的消息机制我就不多做介绍。然后MFC为了使这个消息机制更加的有模块化,更加的体现封装的特性(哪个类的消息封装到哪个类中),采用了MFC的消息映射机制,与SDK的映射本质上是一样的,都是一一对应的关系(一个消息对应一个消息响应函数)。 在总结这几个宏之前我先说一下消息的总类。因为不同的消息会对应不同的宏: 一:标准消息。标准消息很好理解和记。标准消息就是当你用向导为你的程序添加的消息。 这里的所有消息都是标准消息。 二:命令消息:命令消息也很好理解和记。命令消息就是控件向主窗口传递的消息。向按钮控件的双击消息 ,菜单消息,工具条消息。 三:通告消息。通告消息其实也就是命令消息的一种。之所以单独分出来,就自然有它的特别之处,它的特别只用从它的消息名字个格式和其他命令消息的格式的不同上就可以看出来。通告消息就是你控件在某种情况下产生的消息。这种某种情况描述的很模糊,是因为我不知道怎么具体的通称 。你可以看一下MFC类库详解。里面对于控件的每一个类的说明中都有关于这些消息的说明。 这是CCombox类的声明。其他类一样有 。 四:自定义消息。我不知道书上为什么没有把这个消息类型包含进来。WM_USER+消息。 好了 ,说完了消息类型,我们就来说这么几个宏了。 一:消息注释宏 。

C++面向对象程序设计学习笔记(5)

…衆ロ難τιáo~ 提交于 2019-12-07 09:14:27
派生类与继承 概念 继承允许编程者在已有类的基础上创建新的类,可以从一个或者多个已有类中继承函数和数据,并重新定义或者添加新的函数和数据,已有类称为基类或父类,新类称为派生类和子类。 声明 声明一个派生类的一般格式为: class 派生类名 : [继承方式] 基类名 { 派生类新增的数据成员和成员函数 }; 继承方式种类有 private, public ,protected ,分别为私有、公有和保护继承 若不显式地给出关键字,则默认为私有 构成 构造一个派生类包括三部分公作: 1)派生类从基类接受成员 派生类将基类除构造函数和析构函数以外的全部成员全部接收 2)调整从基类接收来的成员 调整包括两个方面 改变基类成员在派生类中的访问属性(通过继承方式实现) 对基类成员重定义(派生类的同名成员会覆盖基类中的同名成员) 3)在派生类中添加新的成员 基类成员在派生类中的访问属性 基类中的成员 在公有派生类中的访问属性 在私有派生类中的访问属性 在保护派生类中的访问属性 私有成员 不可直接访问 不可直接访问 不可直接访问 公有成员 公有 私有 保护 保护成员 保护 私有 保护 派生类对基类成员的访问规则 派生类对基类成员的访问形式主要有两种: (1)内部访问 由派生类中新增的成员函数对基类继承来的成员的访问 (2)对象访问 在派生类外部,通过派生类对象对从基类继承来的成员的访问

Effective C++ 学习笔记(一)

别等时光非礼了梦想. 提交于 2019-12-07 08:15:30
Effective C++ 学习笔记(一) 当我读完Scott Meyers编写的《Effective C++》以后,我特别想再读一遍,因为这是我看过的关于C++非常好的书籍。这本书介绍了C++编程中需要注意的问题(对于一位合格的C++程序员非常关键的问题),作者以精简的语言进行了描述。第二遍阅读的时候,我打算以笔记的形势记录下来。该书一共分为八个部分: 让自己习惯C++ 构造/析构/赋值运算 资源管理 *设计与声明 实现 继承与面向对象的设计 模板与泛型编程 定制new和delete 杂项讨论 一、让自己习惯C++ 1、视C++为一个语言联邦 今天的C++已经是个多重范型编程语言,一个同时支持过程形式、面向对象形式、函数形式、泛型形式、元编程形式的语言。我们可以把C++视为一个由相关语言组成的联邦而非单一语言。为了理解C++,你必须认识其主要次语言。总共有四个: C 。 C++是以C为基础的,区块、语句、预处理器、内置数据类型、数组、指针等都来自C。 Object-Oriented C++ 。这部分是C with Classes所诉求的:classes、封装、继承、多态、virtual函数(动态绑定)……等等。这一部分是面向对象之古典守则在C++上最直接的实施。 Template C++ 。这是C++的泛编程部分,Template相关考虑和设计已经弥漫整个C++

Effective C++学习笔记

非 Y 不嫁゛ 提交于 2019-12-07 08:14:16
条款1:视C++为一个语言联邦 C++有4大组件:C、Object-OrientedC++、Template C++、STL。 条款2:尽量以const、enum、inline替换#define 对于单纯常量,最好以const对象或enums替换#define。 对于形似函数的宏,最好改用inline函数替换#defines。 条款3:尽可能用const 将某些东西声明为const可帮助编译器侦测出错误用法,const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。 当const和non-const成员函数有着实质等价的代码时,令non-const版本调用const版本可避免代码重复。 条款4:确定对象被使用前已被初始化 为内置对象进行手工初始化,因为C++不保证初始化它们。 构造函数最好使用成员初始化列表(memberinitialization list),而不要在构造函数本体内使用赋值操作(assignment)。初值列列出的成员变量,其排列次序应该和它们在类中的声明次序相同。 为避免“跨编译单元之初始化次序”问题,请以localstatic对象替代non-local static对象。 条款5:了解C++默默编写并调用了那些函数 编译器可以暗自为class创建default构造函数、copy构造函数、copy assignment操作符,以及析构函数。

条款07:为多态基类声明virtual析构函数

笑着哭i 提交于 2019-12-07 07:54:33
有许多种做法可以记录时间,因此,设计一个TimeKeeper base class和一些derived classes作为不同的计时方法,相当合情合理: class TimerKeeper{ public: TimeKeeper(); ~TimeKeeper(); ... }; class AtomicClock:public TimeKeeper{...];//原子钟 class WaterClock:public TimeKeeper{...]; //水钟 class WristWatch:public TimeKeeper{...}; //腕表 当我们指向在程序中使用时间,不想操心时间如何计算等细节,这时候我们可以设计factory(工厂)函数,返回指针指向一个定时对象。Factory函数会"返回一个base class指针,指向新生成的derived class对象": TimeKeeper* getTimeKeeper(); //返回一个指针,指向一个TimeKeeper派生类的动态分配对象 这里存在一个问题,当derived class对象经由一个base class指针被删除,而该base class带着一个non-virtual析构函数,其结果未有定义--实际执行时通常发生的对象的dervied成分没被销毁。 消除这个问题的做法很简单:给base

《Effective C++》学习笔记条款07 为多态基类声明virtual析构函数

十年热恋 提交于 2019-12-07 07:24:42
条款 07 :为多态基类声明 virtual 析构函数 当基类的指针指向派生类的对象的时候,当我们使用完,对其调用 delete 的时候,其结果将是未有定义 —— 基类 成分通常会被销毁,而派生类的充分可能还留在堆里。这可是形成资源泄漏、败坏之数据结构、在调试器上消费许多 时间。 消除以上问题的做法很简单:给基类一个 virtual 析构函数。此后删除派生类对象就会如你想要的那般。 任何类只要带有 virtual 函数都几乎确定应该也有一个 virtual 析构函数。 如果一个类不含 virtual 函数,通常表示它并不意图被用做一个基类,当类不企图被当做基类的时候,令其析构函 数为 virtual 往往是个馊主意。因为实现 virtual 函数,需要额外的开销( 指向虚函数表的指针 vptr )。 STL 容器都不带 virtual 析构函数,所以最好别派生它们。 请记住: (1) 带有多态性质的基类应该声明一个virtual析构函数。如果一个类带有任何virtual函数,它就应该拥个 virtual 析 构 函数。 (2) 一个类的设计目的不是作为基类使用,或不是为了具备多态性,就不该声明virtual析构函数。 2013.11.28 下午 来源: CSDN 作者: ccwRadar 链接: https://blog.csdn.net/A09211008/article

C++纯虚函数

不问归期 提交于 2019-12-07 06:55:29
在成员函数的形参后面写上=0,则成员函数为纯虚函数。 纯虚函数声明: virtual 函数类型 函数名 (参数表列) = 0; class Person { virtual void Display () = 0 ; // 纯虚函数 protected : string _name ; // 姓名 }; class Student : public Person {}; 注意: (1)纯虚函数没有函数体; (2)最后面的“=0”并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是虚函数”; (3)这是一个声明语句,最后有分号。 纯虚函数只有函数的名字而不具备函数的功能,不能被调用。 纯虚函数的作用是在基类中为其派生类保留一个函数的名字,以便派生类根据需要对他进行定义。如果在基类中没有保留函数名字,则无法实现多态性。 如果在一个类中声明了纯虚函数,在其派生类中没有对其函数进行定义,则该虚函数在派生类中仍然为纯虚函数。 抽象类: 不用定义对象而只作为一种基本类型用作继承的类叫做抽象类(也叫接口类),凡是包含纯虚函数的类都是抽象类,抽象类的作用是作为一个类族的共同基类,为一个类族提供公共接口,抽象类不能实例化出对象。 纯虚函数在派生类中重新定义以后,派生类才能实例化出对象。 总结: 1、派生类重写基类的虚函数实现多态,要求函数名、参数列表、返回值完全相同。(协变除外) 2

MFC与ATL在COM组件开发中的差异和优劣

我与影子孤独终老i 提交于 2019-12-07 04:38:00
很多年前,微软提供了COM组件对象模型。 随后,提供了COM SDK。 后来,又在MFC中,增加了COM开发的支持。 再后来,又提供了ATL类库,对COM开发提供了更强大的支持。 本文从使用MFC和ATL开发COM组件的角度,来分析比较两者的差异和优劣。 MFC代码部分 首先,需要继承一个基类,并声明成动态创建类(RuntimeClass)。 //.h class CComMFCDemo : public CCmdTarget { DECLARE_DYNCREATE ( CComMFCDemo ) }; //.cpp IMPLEMENT_DYNCREATE ( CComMFCDemo , CCmdTarget ) 然后,声明并实现COM功能函数。 //.h class CComMFCDemo : public CCmdTarget { BSTR Greeting(BSTR name); long Add( long val1, long val2); long Sub( long val1, long val2); }; //.cpp BSTR CComMFCDemo::Greeting(BSTR name) { CComBSTR tmp( "Welcome, " ); tmp.Append(name); return tmp; } long CComMFCDemo::Add(

代码书写规范

非 Y 不嫁゛ 提交于 2019-12-06 23:07:30
前端普适性规范 黄金定律 不论有多少人共同参与同一项目,一定要确保每一行代码都像是同一个人编写的。 永远一致同一套编码规范,可以是这里列出的,也可以是你自己总结的。如果您发现本规范中有任何错误,敬请在问题中指正。 前端普适性规范 项目命名 项目名全部采用小写方式,以中划线分隔,禁止驼峰式命名。例如:my-project-name 文件命名 文件命名参照项目命名规则。示例:error-report.html 有复数结构时,要采用复数命名法,例如:脚本,样式,图像,数据模型 文件名中只规范小写英文字母az,排序数字09或间隔符-组成,禁止包含特殊符号,某些空格,$等 为了醒目,某些说明文件的文件名,可以使用大写字母,例如:README,LICENSE 为更好的表达语义,文件名使用英文名词命名,或英文简写。 永久命名带有广告等英文的单词,例如ad,adv,adver,advertising,防止该模块被浏览器当成垃圾广告过滤掉。任何文件的命名均如此。 文件常用命名: index.shtml引导页&首页 main.shtml主页 download.shtml下载页面 act.html活动列表页面 video.html视频 cdkey.html CDKEY页面 base.css基本样式 layout.css框架布局 module.css模块样式 global.css局部样式 font