接触VC之二:MFC类基础,C++程序编写规范介绍

2016-01-29 12:18 6 1 收藏

接触VC之二:MFC类基础,C++程序编写规范介绍,接触VC之二:MFC类基础,C++程序编写规范介绍

【 tulaoshi.com - C语言心得技巧 】

接触VC之二:MFC类基础,C++程序编写规范介绍
作者:释雪

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

由于本文是面对C语言基础的(因为我就是从C学起来的),而MFC是利用C++类技术构建起来的。因此有必要在此为只了解C的朋友们,普及一下C++语言中类的概念。熟悉C++的朋友可以跳过本部分。 从总体来说C++是向下兼容C的,你可以很不费力气地将用C编好了的程序拿到C++环境下编译执行。其C++只不过是在C的基础上添加面向对象技术(OOP),也就是类的概念,且值得一提的是C与C++都是由美国的贝尔实验室(在之前我只知道发明过电话)发明的。

一、什么是类?

按一些书本上的定义来说“就是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的操作封装在一起的集合体。因此,类中的数据具有隐藏性,类还具有封装性。”嗯,类还像上面的那句话一样,具有很强的抽象性。让我来用一个例子来解释类吧。 嗯,我们世界上有一个生物种类叫做鸟,在C++上世界我们也可以制作一个类叫做鸟类。它应该有头,有躯干,有腿,有内脏,还有一个非常重要的翅膀。于是,其类描述如下:

class Aves{    char m_strHead[10];    char m_strTrunk[10];    char m_strCrura[10];    char m_strWing[10];    char m_strBowels[10];};
哈,这样一个鸟类建立好了,怎么样与C中结构体没什么两样吧。(在C++中struct与class基本上是同义词,过一会儿会说到它们有什么不同的。)如果你想建立一个小鸟的话,不用像C中那样麻烦地打struct Aves XXX,而是直接使用Aves XXX就可以了,不打前面的struct或class。在人类对鸟类形成概念之前,鸟的翅膀、躯体等等就真的存在了(没有人有疑议吧?),但在人们根本不知道鸟的那对长满羽毛的扑扇扑扇就可以飞的东西叫什么名字,也不会知道翅膀这个词指的是什么意思。现在我们的这个C++鸟类也正处于这个状态,在那些成员变量中没有被赋与任何值。而现实生活中,一个种类中的具体名字是在一个类对象形成初期被命名的,这是一个名词初始化的过程。在C++类中,当建立一个类对象时总也要有一个初始化各成员变量的过程,于是构造函数被引入了。它在一个实例被声明和被建立(这两个有一些区别)时调用。我们的C++鸟类各个成员变量的赋值命名就可以利用它来实现:
class Aves{    Aves ()    {         strcpy(m_strHead, "Head");         strcpy(m_strTrunk, "Trunk");         strcpy(m_strCrura, "Crura");         strcpy(m_strWing, "Wing");         strcpy(m_strBowels,”Bowels”);    }    char m_strHead[10];    char m_strTrunk[10];    char m_strCrura[10];    char m_strWing[10];};
瞧,我是怎么在类里面建立一个构造函数的。一个类的构造函数的名字要与其类名同名,且不能有返回值,void也不行。我们在构造函数中,对各个成员函数命名。当Aves bird;时(声明一个bird对象),Aves类的构造函数将会被调用,把bird.m_strHead,bird.m_strTrunk等等成员变量分别赋值为”Head”,”Trunk”。这样一讲,希望大家对构造函数有了一定的了解了。我们既然有构造函数可以对类成员进行初始化,那么用什么来对类成员销注呢?说白了就是有在建立类对象时调用的函数,什么函数是在类对象被删除时调用的函数呢?那就是析构函数,其命名规则与构造函数是一样的,只不过需要在其函数名前紧加一个~(波浪号),且不能有参数。如我们的类就是~Aves();至于析构函数具体作用嘛…举个例子来说,当在构造函数中申请了一段内存,我们就必须在析构函数中释放这段内存,否则会内存泄漏。那么什么时候会引发声明的类对象被删除呢?要解决这个问题,我还需要借用一个叫名域(name space)的概念。当系统执行指针离开声明的类对象所在名域时,就会引发类对象的删除(类型的有效型也可以如此解释)。而名域这个概念最实称的理解就是一对大括号,在这对括号内的空间就是一个名域。(当然名域其实不是这么简单的。如类本身就是一个名域,还可以自己设定一个名域,用于类型声明设定,可以用已有的类型冲突。名域真实用途是这个。具体含义参见《C++标准库》,图书大厦有侯捷先生的译本)比如:
{//名域1    char * strValue;    {//名域2         Aves bird;         {//名域3              strValue=bird.m_strWing;         }}//<<就在后大括号这里引发了bird对象的析构函数strValue=”Blue Atlantis”;}
这里有3个名域,我在名域2中声明了一只小鸟。因为名域3也被包括在名域2里,所以名域3中的空间也属于名域2,于是在名域3中引用小鸟对象是正确的。当执行指针离开名域2那一瞬,C++系统将会把在名域2中声明的所有变量及对象删除掉。当对象被删除时,首先会执行析构函数,然后系统再去释放对象所占用的内存空间。所以当执行到strVal

来源:https://www.tulaoshi.com/n/20160129/1485536.html

延伸阅读
首先我们说下通过鼠标的移动来绘制直线。 这里要捕获到鼠标的两个消息:WM_LBUTTONDOWN, WM_LBUTTONUP。响应WM_LBUTTONDOWN消息记录直线的起始点,响应WM_LBUTTONUP消息记录直线的终点并绘制直线。 好了,我们看看怎么响应。 void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) { //MessageBox("Left Button Clicks D...
4.9.4 编写动作组件 一般使用的动作是通过在对象观察器中设置其属性为具体的应用程序创建的。要使用这样的动作,必须编写事件处理程序在本节的“执行动作”部分描述的分发流程中的某一点上响应动作。 当使用C++Builder自带的预定义动作时,不需要写任何事件处理程序,因为目标组件知道如何响应该动作。也可以创建自己的预定义...
虽然能用DLL实现的功能都可以用COM来替代,但DLL的优点确实不少,它更容易创建。本文将讨论如何利用VC MFC来创建不同类型的DLL,以及如何使用他们。 一、DLL的不同类型 使用VC++可以生成两种类型的DLL:MFC扩展DLL和常规DLL。常规DLL有可以分为动态连接和静态连接。Visual C++还可以生成WIN32 DLL,但不是这里讨论的主要对象。 1、MFC扩展DL...
if语句 if语句用于测试条件并在条件为真时执行一桌或几条语句。 说明:if表达式后面不能带分号,否则它本身表示代码中的空语句,使编译器将空语句解释为在条件为真时执行的语句。 if (x == 10); // Warning! Extra semicolon! DoSomething(x); 这里DoSomething()函数总会执行,因为编译器不把它看成在条件为真时执行...
入门简介 变量 C++数据类型 C++操作符 C++中的函数 main函数 数组 字符串数组 字符串操作函数 C++是个强大的语言,可以用于做别的语言做不了的工作。但是,这种强大功能是有代价的。开始使用C++时,你可能会遇到内存溢出和访问失效等问题,使程序死机。这里用最简短的篇幅介绍C++语言基础。C++语言本身有专著介绍,这种书...

经验教程

423

收藏

56
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部