搜档网
当前位置:搜档网 › MFC中文档视图框架和文档模板之间的关系 四个类常用的成员函数

MFC中文档视图框架和文档模板之间的关系 四个类常用的成员函数

MFC中文档视图框架和文档模板之间的关系  四个类常用的成员函数
MFC中文档视图框架和文档模板之间的关系  四个类常用的成员函数

文档对象:是用来保存数据的。

视图对象:是用来显示和编辑数据的。

应用程序框架:框架是用来管理不同文档显示界面的。例如你有一个数据网格显示界面,还有一个图形显示界面,它们的数据可能都来自你的文档,但是视图不同,怎么办用框架。为什么不用视图?为的是把界面管理独立的拿出来。

文档模板:MFC把文档/视图/框架视为一体,只要你创建文档/视图框架结构的程序,必定会为你创建这三个类。这个工作在在应用程序初始化时完成,如下:

[cpp]view plaincopy

1.BOOL CMyHtmlApp::InitInstance()

2.{

3. CSingleDocTemplate* pDocTemplate;

4. pDocTemplate = new CSingleDocTemplate(

5. IDR_MAINFRAME,

6. RUNTIME_CLASS(CMyHtmlDoc),

7. RUNTIME_CLASS(CMainFrame), // main SDI frame window

8. RUNTIME_CLASS(CMyHtmlView));

9. AddDocTemplate(pDocTemplate);

10. }

单文档:就是一次只能打开一个文件,和你的文档类型支持的多少无关。你完全可

以做一个单文档的支持所有图象格式的程序,只不过它一次只能打开一个文档罢了。

多文档:就是你可以打开多个文件,和文档类型也无关。你也可以作一个可以同时

打开多个文档的程序,但它只支持一种文档类型。

何时需要文档/视图框架结构?

首先你可以不使用文档视图这种框架结构,即便是在MFC中。你可以在你需要的时候选择使用这种方式。你可以完成一个只有视图没有文档的程序,例如一个基于对话框的应用。

哪什么时候需要呢?

当你想将你的数据层和界面层分开的时候。

通常我们对数据的操作放在文档类中,例如存取,打开,关闭。在这里你可以尽情的对你的数据进行操作,如果你需要,在对数据进行了改变后,对视图做一下更新,那么程序会将你对数据所做的改变呈现给你的程序的用户。由此可见视图的作用就是提供一个用户和数据之间进行数据交换的界面,它的作用就是在需要的时候显示数据,并在需要的时候提供输入界面。当用户输入后实际的数据操作工作是由文档类来做的。

那框架类有在做什么呢?

框架类是为了便于管理你的文档类和视图类而存在的。通常我们的操作都是通过视图窗口完成,消息由视图进行接收并且进行处理。所以消息映射定义一般在视图中。

但如果一个应用同时拥有多个视而当前活动视没有对消息进行处理则消息会发往框架窗口。另外框架窗口可以方便的处理非窗口消息。

再来说一边典型的单文档程序的生成过程(不完整,只挑有用的)

?

?1、CwinApp对象被建立,这个对象是全局的且只能有一个,名字叫theApp。

这时你可以完成一些工作,例如对注册表的操作,(如果你想写一个不修改注册表的软件,需要在这里做写工作)

2、在InitInstance()函数中创建文档模板,文档模板以CruntimClass静态成员

指针做构造参数。

3、执行MFC框架默认的命令行参数。命令行参数有很多其中之一是,Cmd1

它会创建一个新文件。(如果没有命令行参数则执行默认的ID_FILE_NEW)

4、文档模板的实例根据三个类的动态创建信息创建出文档、视图、框架。

5、对文档、视图、框架进行初始化。

o文档,视图,框架之间的相互作用。

由上面的典型的单文档程序的生成过程可以看出一个完整的应用一般由四个类组成:

?CWinApp应用类,

?CFrameWnd框架类,

?CDocument文档类,

?CView视图类。

我将四个类常用的成员函数列出,大家一看便知。不过参数,

返回值均未列出,大家可以从MSDN上了解更多。几个重要的虚函数也未做说明。大家自己看吧。

通过全局函数AfxGetApp可以得到CWinApp应用类的全局对象theApp.

CwinApp

[cpp]view plaincopy

1.//数据成员:

2.m_pszAppName 应用程序名称

3.m_pszExeName 可执行文件的名称

4.m_pszProfileName INI文件的名

5.m_pszRegistryKey 注册表或INI文件的KEY

6.m_hInstance 实例的句柄

7.m_pMainWnd 为框架窗口指针

8.//成员函数:

9.InitInstance() //初始化

10.ParseCommandLine() //完成命令行的解析处理

11.CFrameWnd

12.GetActiveDocument() //得到当前活动文档指针

13.GetActiveView() //得到当前活动视指针

14.SetActiveView() //设置当前视图为活动视图

15.CDocument

16.OnNewDocument()

17.OnOpenDocument()

18.OnSaveDocument()

19.OnFileClose()

20.GetFirstViewPosition() //文档对象链表中的第一个文档位置

21.GetNextView() //下一个

22.//以上是用来遍历所有和文档关联的视图

23.GetDocTemplate()得到文档模板指针

24.AddView() //增加一个视图

25.RemoveView() //删除一个视图

26.UpdateAllView() //更新所有视图

27.Cview

28.GetDocument()得到对应的文档指针

其他的就不列出了,大家还是看MSDN。你可以直接查看CWinApp应用类,CFrameWnd框架类,CDocument文档类,CView视图类的类成员。

最后说说几个常见到的问题。

o1、为什么在对话框的应用程序中没有发现文档模板?

默认的对话框程序没有使用文档/视图框架结构。

o 2、如果我使用数据库作为数据源是否意味着可以不需要文档类?

看你自己,但是我建议使用。因为可以文档,视图这一个清晰方便的框架结构,以及方便完成三者之间的相互作用

C++类中的静态成员变量和静态成员函数的作用

数据成员可以分静态变量、非静态变量两种. 静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员. 非成静态员:所有没有加Static的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问..非静态成员的生存期决定于该类的生存期..而静态成员则不存在生存期的概念,因为静态成员始终驻留在内容中.. 一个类中也可以包含静态成员和非静态成员,类中也包括静态构造函数和非静态构造函数.. 分两个方面来总结,第一方面主要是相对于面向过程而言,即在这方面不涉及到类,第二方面相对于面向对象而言,主要说明static在类中的作用。 一、在面向过程设计中的static关键字 1、静态全局变量 定义:在全局变量前,加上关键字static 该变量就被定义成为了一个静态全局变量。 特点: A、该变量在全局数据区分配内存。 B、初始化:如果不显式初始化,那么将被隐式初始化为0(自动变量是随机的,除非显式地初始化)。 C、访变量只在本源文件可见,严格的讲应该为定义之处开始到本文件结束。 例(摘于C++程序设计教程---钱能主编P103)://file1.cpp //Example 1 #include void fn(); static int n; //定义静态全局变量 void main() {

n=20; cout <

实验八 静态数据成员和静态函数成员

实验八静态数据成员和静态函数成员 任务一: 1、了解多文件工程 本次实验需要创建一个工程,此工程由三个文件组成 1)头文件client.h ——类的声明 2)源文件client.cpp——成员函数的定义 3)源文件test.cpp——main()函数的定义 2、了解CLIENT类 本次实验的主角是CLIENT(客户机)类。在实际生活中,计算机网络的应用模式为client/server(客户机/服务器)模式。情况很简单,即多台客户机与一台服务器连接,服务器为客户机提供服务。 3、实验任务 1)阅读程序代码,仔细分析CLIENT类的各数据成员及函数成员,写出分析结果 2)创建多文件工程,编译并运行 3)为main()函数的各条语句增加注释 4)将数据成员ServerName改为非静态,其它类成员的静态属性不变。 修改程序代码,使客户机a连接到另一台服务器M。(b仍与N连接) 任务二: 生成一个储蓄类CK。用静态数据成员表示每个存款人的年利率lixi。类的每个对象包含一个私有数据成员cunkuan,表示当前存款额。提供一个calLiXi()成员函数,计算利息,用cunkuan乘以lixi除以12取得月息,不计复利,并将这个月息加进cunkuan中。提供设置存款额函数set()。提供一个静态成员函数modLiXi(),可以将利率lixi修改为新值。 实例化两个不同的CK对象saver1和saver2,结余分别为2000.0和3000.0。将lixi设置为3%,计算一个月后和3个月后每个存款人的结余并打印新的结果。 首先定义储蓄类CK,它包含一个私有数据成员cunkuan,数据类型为double,一个静态数据成员年利率lixi,数据类型也为double;包含一个成员函数calLiXi()和一个静态成员函数modLiXi(),其中modLiXi()应含有一个表示要更改的年利率的新值的参数。 完善程序: #include class CK{ double cunkuan; public: ? //定义静态数据成员lixi CK(double c){?}//构造函数 void set(double x){?}//设置存款额 ? //定义静态成员函数modLiXi() void calLiXi(int m=1); };

静态成员函数一般情况下只能访问静态成员变量

静态成员函数一般情况下只能访问静态成员变量,因为不接受隐含的this指针。另外作为类的静态成员函数,不用声明对象,便可直接调用,例如类A的静态成员函数fun(); A::fun(); 1、主要用于封装全局变量和全局函数。以避免在文件作用域内包含带外部连接的数据。 例如全局变量:int path;int para1; 解决办法:设计一个全局类,并将这些全局名称声明为静态变量,并编写静态函数来调用这些变量。 class Global{ static int s_path; static int s_para; private: Global();//不实现,避免无意中的实例化 public: //manipulators static void setPath(int path){s_path = path;} static void setPara(int para){s_para = para;} //accessors static int getPath(){return s_path;} static int getPara(){return s_para;} } 2、对自由函数的封装 在.h文件的文件作用域内避免使用自由函数(运算符函数除外);在.c文件中避免使用带有外部连接的自由函数,因此可以使用静态成员函数进行处理。 例如:int getPara();int getPath();我们可以通过声明一个结构的静态方法代替: struct SysUtil{ static int getPath(); static int getPara(); }这样,唯一有冲突危险的就是出现类名SysUtil了。

C++静态成员函数小结

C++静态成员函数小结 一静态数据成员 (1) 1.静态数据成员的定义 (1) 2.静态数据成员被类的所有对象所共享(包括该类派生类的对象) (2) 3.静态数据成员可以成为成员函数的可选参数(普通数据成员则不可以) (2) 4.静态数据成员的类型可以是所属类的类型(普通数据成员则不可以) (3) 5.静态数据成员的值在const成员函数中可以被合法的改变 (3) 二静态成员函数 (3) 1.静态成员函数的地址可用普通函数指针储存(普通成员函数地址需要用类成员函数 指针来储存) (4) 2.静态成员函数不可以调用类的非静态成员 (4) 3.静态成员函数不可以同时声明为virtual、const、volatile函数 (4) 类中的静态成员真是个让人爱恨交加的特性。我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动。 静态类成员包括静态数据成员和静态函数成员两部分。 一静态数据成员 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时,静态数据成员还具有以下特点: 1.静态数据成员的定义 静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中。其定义方式与全局变量相同。举例如下: xxx.h文件 class base{ private: static const int _i;//声明,标准c++支持有序类型在类体中初始化,但vc6不支持。 }; xxx.cpp文件 const int base::_i=10;//定义(初始化)时不受private和protected访问限制. 注:不要试图在头文件中定义(初始化)静态数据成员。在大多数的情况下,这样做会引起重复定义这样的

C++中静态成员函数访问非静态成员变量

C++中静态成员函数访问非静态成员变量 这两天写一个简单的程序,由于程序运行占用cpu比较厉害,导致运行中界面窗口无法交互,因此想到了多线程,以前没有接触过mfc多线程,在网上看了两篇文章,觉得也不过如此,就开始动手写了,结果发现即使是看别人写很简单,自己动手也会出现很多问题,哪怕是看起来真的很简单的问题。 这里遇到的问题就是由于多线程的函数必须是static的,然后需要在里面调用non-static的函数,我就没有办法了,于是又开始网上找资料,下面就将这篇文章转贴过来,供大家学习思考:先看一个class class a { public: static FunctionA() { menber = 1; } private: int menber; } 编译上述代码,出错。原因很简单大家都知道,静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的 member可能都没有分配内存。静态成员函数没有隐含的this自变量。所以,它就无法访问自己类的非静态成员。(看过一篇很好的文章《浅析C++中的this指针》介绍这个方面的详细内容)那要想访问怎么办呢?地球人都知道只要将: int menber; //change the line above to: static int menber; 但是这个方法让我们不得不将static function内用到的成员变量都变成static的了,而且static 的成员还要显式初始化,有没有更好的方法?答案是肯定的。如下: class a { public: static FunctionA(a* _a) { a-> menber = 1; (window.cproArray = window.cproArray || []).push({ id: "u2280119" }); } private: int menber; } 前提是这个类要分配了内存空间。其实这里我做的就是将一个对象指针作为静态成员函数的“this”指针,意在模仿传递非静态成员函数里this变量。

静态函数 静态数据成员与静态成员函数 为什么虚函数必须是非静态成员函数 构造函数能为static吗

静态函数静态数据成员与静态成员函数为什么虚函数必须是非静态成员函数构造函数能为static吗? 2009-07-05 14:27 静态函数 用static声明的函数是静态函数。静态函数可以分为全局静态函数和类的静态成员函数。 Static关键字 在类中,用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时被初始化,对于该类的所有对象来说,static成员变量只有一份。用static声明的方法是静态方法,在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员。 静态方法不再是针对于某个对象调用,所以不能访问非静态成员。 可以通过对象引用或类名(不需要实例化)访问静态成员 C++类静态数据成员与类静态成员函数 函数调用的结果不会访问或者修改任何对象(非static)数据成员,这样的成员声明为静态成员函数比较好。且如果static int func(....)不是出现在类中,则它不是一个静态成员函数,只是一个普通的全局函数,只不过由于static的限制,它只能在文件所在的编译单位内使用,不能在其它编译单位内使用。 静态成员函数的声明除了在类体的函数声明前加上关键字static,以及不能声明为const或者volatile之外,与非静态成员函数相同。出现在类体之外的函数定义不能制定关键字static。 静态成员函数没有this指针。 在没有讲述本章内容之前如果我们想要在一个范围内共享某一个数据,那么我们会设立全局对象,但面向对象的程序是由对象构成的,我们如何才能在类范围内共享数据呢? 这个问题便是本章的重点:声明为static的类成员或者成员函数便能在类的范围内共同享,我们把这样的成员称做静态成员和静态成员函数。 下面我们用几个实例来说明这个问题,类的成员需要保护,通常情况下为了不违背类的封装特性,我们是把类成员设置为protected(保护状态)的,但是我们为了简化代码,使要说明的问题更为直观,更容易理解,我们在此处都设置为public。 以下程序我们来做一个模拟访问的例子,在程序中,每建立一个对象我们设置的类静态成员变自动加一,代码如下: #include using namespace std;

C++教程第07章 类与对象-5 类的静态成员及常量

7章类与对象 7.1 类和对象(定义及使用)初步 7.2成员函数的重载 7.3 对象的初始化、构造函数与析构函数 7. 4 类的定义及其使用 7. 5 类的静态成员及常量成员 7.5.1静态成员 7.5.1.1静态成员数据 1.静态成员数据的定义,与静态类型的变量的定义方式一样,要在成员数据的定义之前加关键字static。 2.静态成员数据必须有确定的值,但由于在类的定义中不能对成员数据直接进行初始化,故必须在类定义的外部对静态成员数据再声明一次,并进行初始化,此时,前面不需要加关键字static。同时为了保持静态成员数据取值的一致性,一般在类的构造函数中不给静态成员数据设置初值。对静态成员数据初始化的顺序为它们在类体外声明的顺序. 3.在同一个程序中,当一个类有多个对象时,则这些对象中的静态成员数据都共享同一个存储空间,即在定义类时,就为静态成员数据分配存储单元,以后创建该类的对象时,将不再为该静态成员数据分配存储单元,也不会对该静态成员数据初始化。 静态成员数据初始化格式: <类型><类名> ::<静态成员数据> = <数值> ; 4.类的静态成员数据具有全局变量的某些特征,比如在程序开始运行时就为静态成员数据分配存储空间,但它只有类的作用域。即在执行main()之前,首先对静态成员数据和全局变量分配存储空间并进行初始化,当整个程序结束时才撤消静态成员数据和全局变量。5.静态成员数据也可以分为公有的、私有的和受保护的静态成员。 对公有静态成员,即可以通过类的对象进行访问,也可以通过类名直接访问(这是静态成员数据与一般成员数据的另一个区别)。格式: <类名>::<静态成员数据> 私有的和保护的静态成员数据则只能被该类的公有成员函数访问。 6.值得注意的是,在创建任何对象之前,类的静态成员数据已经存在并可以引. 7.静态成员数据也可以是用户自定义类型的数据。 7.5.1.2静态成员函数 1.定义静态成员函数时,只要在成员函数名前用关键字static修饰即可。 2.静态成员函数属于整个类,它是由该类的所有对象所共享的成员函数,它不属于某个对象。因此它不含有隐含的*this指针参数,故它不能像普通成员函数那样直接访问对象中的非静态的成员(成员函数和成员数据),即 静态成员函数只能访问所在类的静态的成员(成员函数和成员数据)、全局变量、外部函数等。(因为它们不属于任一个特定对象)。

实验4 含有类的静态成员与类的友元的C++程序设计

实验4 含有类的静态成员与类的友元的C++程序设计 专业:计算机科学与技术班级:10计本1班学号:姓名: 实验地点:B102实验时间:2011/11/1 指导教师:李佐勇 一、实验目的 1.理解类的静态成员解决共享问题的机制; 2.掌握类的静态数据成员与静态函数成员的实现方法; 3.理解利用友元关系实现数据共享的机制,掌握类的友元函数以及友元类的实现方法; 4.学习多文件结构在C++程序中的使用。 二、实验环境 一台PC机,Windows XP操作系统,Visual C++ 6.0开发环境。 三、实验内容 1.设计一个解决王婆卖瓜问题的程序。王婆卖瓜,每卖一个瓜,需记录该瓜的重量,还要记录所卖出的总重量和总个数,同时还允许退瓜。设计一个具有静态数据、函数成员的watermelon类。 实现提示:西瓜类有3个数据成员:重量weight、总重量total_weight以及总个数total_number。因为不论西瓜是否卖出,总重量total_weight和总个数total_number这两个数据总是要保留的,且这两个数据与单个的西瓜无关联,因此这两个数据要申明为静态数据成员。成员函数:卖瓜用构造函数模拟,退瓜用析构函数模拟,瓜重用disp成员函数给出屏幕提示。为了用不与特定对象相联系的静态成员函数来访问静态数据,还需要定义一个显示总重量和总个数的静态成员函数total_disp。 2.设计一个程序,其中有3个类,即CBank、BBank和GBank,分别为中国银行类、工商银行类和农业银行类。每个类都包含一个私有数据balance,用于存放储户在该行的存款数,另有一个友元函数total用于计算储户在这3家银行中的总存款数。 3. 设计一个程序,其中有2个类,Point类为点类,包含2个私有数据x和y,表示点的坐标,line类为直线类,包含3个私有数据a、b和c,表示直线方程ax+by+c=0。另有一个友元函数dist,用于计算一个点到直线的距离。点与直线之间的距离计算公式如下: 2 2b a c by ax d ++ + = 要求: ①将Point与Line类的定义放在头文件head.h中; ②将Point与Line类的实现部分放在PL.cpp中; ③主函数(类的使用)文件定义为:Lab04_3.cpp。 四、实验记录 1.#include using namespace std; class watermelon { public: watermelon(double w){ weight=w;

C 类的静态成员详细讲解

在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。 静态成员的定义或声明要加个关键static。静态成员可以通过双冒号来使用即<类名>::<静态成员名>。 在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象。希望阅读本文可以使读者对类的静态成员变量和成员函数有更为深刻的认识。 第一个例子,通过类名调用静态成员函数和非静态成员函数 [cpp]view plaincopyprint? 1.class Point 2.{ 3.public: 4.void init() 5.{ 6.} 7.static void output() 8.{ 9.} 10.}; 11.void main() 12.{ 13.Point::init(); 14.Point::output(); 15.} 编译出错:error C2352:'Point::init':illegal call of non-static member function 结论1:不能通过类名来调用类的非静态成员函数。

第二个例子,通过类的对象调用静态成员函数和非静态成员函数将上例的main()改为: [cpp]view plaincopyprint? 1.void main() 2.{ 3.Point pt; 4.pt.init(); 5.pt.output(); 6.} 编译通过。 结论2:类的对象可以使用静态成员函数和非静态成员函数。 第三个例子,在类的静态成员函数中使用类的非静态成员[cpp]view plaincopyprint? 1.#include 2.class Point 3.{ 4.public: 5.void init() 6.{ 7.} 8.static void output() 9.{ 10.printf("%d\n",m_x); 11.} 12.private: 13.int m_x; 14.}; 15.void main() 16.{ 17.Point pt;

实验四类与对象(静态数据成员)

实验四类与对象(静态成员) 一、实验目的与要求 1.掌握类的定义,成员函数的定义; 2.掌握对象的初始化及应用; 3.掌握构造函数的使用; 4.掌握析构函数的使用; 5.掌握静态的使用; 二、实验内容 1.设计一个学生类Student,它要求有以下面成员: 私有数据成员: 注册号Registration,姓名Name、数学成绩Math、英语成绩English、高级程序设计成绩Programming; 静态数据信息学生人数Count; 具有的公有的函数成员: (1)求三门课总成绩的函数Sum(); (2)求三门课平均成绩的函数Average(); (3)显示学生数据信息的函数Print(); (4)获取学生注册号的函数Get_reg_num(); (5)设置学生数据信息的函数Set_stu_inf(); (6)静态的获取学生人数函数Get_coutnt(); (7)构造函数; (8)析构函数. 为了统一格式,也方便同学们更有针对性的实现 Student类的声明为: //Student.h #include using namespace std; class Student { private: int Registration; char Name[20];

int Math; int English; int Programming; static int Count; public: Student(int ,char[],int,int,int); Student(Student &); ~Student(); int Sum(); double Average(); void Print(); int Get_reg_num(); void Set_stu_inf(int,char[],int ,int ,int); static int Get_count(); }; //shiyan4_1.cpp #include"Student.h" //对静态数据成员进行初始化,补充代码 //(1) int main() { //1.输出当前的学生数,补充代码 cout<<"当前的学生数:"<

C#静态类和静态类成员详解

C#静态类和静态类成员详解 C#静态类和静态类成员用于创建无需创建类的实例就能够访问的数据和函数。静态类成员可用于分离独立于任何对象标识的数据和行为:无论对象发生什么更改,这些数据和函数都不会随之变化。当类中没有依赖对象标识的数据或行为时,就可以使用静态类。 让我们来看看静态类: 类可以声明为static的,以指示它仅包含静态成员。不能使用new 关键字创建静态类的实例。静态类在加载包含该类的程序或命名空间时由.NET Framework 公共语言运行库(CLR) 自动加载。 使用静态类来包含不与特定对象关联的方法。例如,创建一组不操作实例数据并且不与代码中的特定对象关联的方法是很常见的要求。您应该使用静态类来包含那些方法。 静态类的主要功能如下: 1、它们仅包含静态成员。 2、它们不能被实例化。 3、它们是密封的。 4、它们不能包含实例构造函数(C# 编程指南)。 因此创建静态类与创建仅包含静态成员和私有构造函数的类大致一样。私有构造函数阻止类被实例化。 使用静态类的优点在于,编译器能够执行检查以确保不致偶然地添加实例成员。编译器将保证不会创建此类的实利。 静态类是密封的,因此不可被继承。静态类不能包含构造函数,但仍可声明静态构造函数以分配初始值或设置某个静态状态。 何时使用静态类 假设有一个类CompanyInfo,它包含用于获取有关公司名称和地址信息的下列方法。 1class CompanyInfo 2 3{ 4 5public string GetCompanyName() { return "CompanyName"; } 6 7public string GetCompanyAddress() { return "CompanyAddress"; } 8 9//... 10 11} 不需要将这些方法附加到该类的具体实例。因此,您可以将它声明为静态类,而不是创建此类的不必要实例,如下所示: 12static class CompanyInfo 13 14{ 15 16public static string GetCompanyName() { 17return "CompanyName"; }

类中有关静态成员的使用

一 static的作用 1 什么是static??static 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性。 2、为什么要引入static??函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现?最容易想到的方法是定义一个全局的变量,但定义为一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅受此函数控制)。 3、什么时候用static??需要一个数据对象为整个类而非某个对象服务,同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见。 二,类的静态成员简介 静态局部变量 ? 1.存放在静态存储区 ? 2. 在两次函数调用期间保留原值仅在函数内部可见 ? 3.可以被自动初始化为0 静态全局变量 ?作用域:仅在变量所在的文件内 类的静态成员(C++特有的语法) ?至今为止,我们使用的成员变量和成员函数都由某个特定的对象调用。但是,也许有些成员变量和成员函数,是属于整个类的。

?静态成员变量,必须在类声明之后,用::初始化; ?静态成员的值,和某一个具体对象是无关的。 ?对于非静态成员来说,每个对象都有一个特定的值,每个对象都为自己非静态成员,在内存里保留一个位置。?而静态成员,整个类只有一个备份 ?静态成员函数的使用限制 ? 1. 静态成员函数,被类的所有对象共享。不是和某一个特定的对象。而是和整个类相关联。 ? 2.静态成员函数内部,不可以使用this指针。因为this指针是指向每一个具体对象的。所以说this指针本身就是非静态成员变量。 ? 3.静态成员函数只能访问静态成员(包括静态成员函数和静态成员变量),而不能访问非静态成员。但是非静态成员函数既可以访问非静态成员也可以访问静态成员。 ? 4.静态成员函数,也可以有public和private。 private的静态成员函数,不能在外部用类名或对象名访问。只能从类的内部被其他的静态成员函数访问。?静态成员访问方式 ?类名::静态成员名(推荐) 三,类的静态成员的深入研究 静态数据成员的使用方法和注意事项如下:?1、静态数据成员在定义或说明时前面加关键字static。?2、静态成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式如下:?<数据类型><类名>::< 静态数据成员名>=<值>?这表明:?(1) 初始

C++ 静态函数

C++关于静态成员函数和常成员函数 静态数据成员一样,静态成员函数是类的一部分,而不是对象的一部分。如果要在类外调用公用的静态成员函数,要用类名和域运算符“∷”。如 Box∷volume( ); 实际上也允许通过对象名调用静态成员函数,如 a.volume( ); 但这并不意味着此函数是属于对象a的,而只是用a的类型而已。 静态成员函数的作用是为了能处理静态数据成员。 可以说,静态成员函数与非静态成员函数的根本区别是:非静态成员函数有this指针,静态成员函数并不属于某一对象,它与任何对象都无关,静态成员函数没有this指针。由此决定了静态成员函数不能访问本类中的非静态成员。 在C++程序中,静态成员函数主要用来访问静态数据成员,而不访问非静态成员。假如在一个静态成员函数中有以下语句: cout< using namespace std; class Student //定义Student类 {public: Student(int n,int a,float s):num(n),age(a),score(s){ } //定义构造函数 void total( ); static float average( ); //声明静态成员函数 private:

相关主题