中易网

MFC有的函数前面加::是什么意思

答案:5  悬赏:10  
解决时间 2021-01-15 01:18
MFC有的函数前面加::是什么意思
最佳答案
一、在应用程序类中定义
用MFC生成的工程中都有一个名为CxxxApp的类,它派生于CWinApp类。这个类主要进行程序的初始化,生成文档、视图对象等工作。我们可以把需要全局访问的变量和函数定义为这个类的成员变量和成员函数,就可以实现全局访问了。
从严格意义上讲,这种变量和函数并不是全局的,因为它仍然只是类中的成员,只是由于我们很容易获得CxxxApp类的指针,所以我们可以在文档、视图、对 话框以及各种自定义类中访问到它们,达到与全局变量类似的效果。访问时用函数“AfxGetApp()”获得CxxxApp类的指针,用 “AfxGetApp()->成员”访问变量或函数。
例:
Test.h:(应用程序类头文件)
class CTestApp : public CWinApp
{
public:
int x; //全局变量
int f(int y); //全局函数
…………
};
Test.cpp:(应用程序类程序文件)
int CTestApp::f(int y) //全局函数定义
{
y++;
return y;
}
定义在CTestApp类中的变量和函数可以在其它类中被访问。比如在视图的某函数中要访问变量x和函数f():
void CTestView::xyz()
{
CTestApp *app = (CTestApp *)AfxGetApp(); //生成指向应用程序类的指针
app->x = 0; //访问变量x
int z = app->f(1); //访问函数f()
…………
}
这样,变量x和函数f()可以视作为全局的。
用这种方法实现的全局变量和全局函数虽比较简单,但也有缺点,一是访问不太方便,每次都需要获取应用程序类的指针;再就是把一些与应用程序类本身无关的变量和函数放在里面,使这个类看上去怪怪的,破坏了类的封装。
二、用静态变量和静态函数实现
很喜欢API函数的那种调用方法,不论在哪个类中只要用“::API函数”就可以调用了。合理利用静态类型(static)可以实现与此相似的全局变量和全局函数。
静态变量和静态函数有如下性质:
若在一个类中用关键字static声明数据成员,则这个数据成员就只存在一个拷贝,无论该类创建了多少个实例,它始终只存在一个,即使该类的实例一个也没创建,它也存在。
若在一个类中用关键字static声明函数,该函数可以用“类名::函数名”方式访问,无需引用该类的实例,甚至这个类的实例可以不存在。
利用这个性质实现的全局变量和函数使用起来很方便。
值得注意的是,全局变量和全局函数最好集中封装,不要在文档、视图等类内部定义,这样用起来才有全局的感觉。
例:
1、添加一个没有基类的新类,设类名起为CPublic,姑且称之为公用类
单击“Insert”菜单下的“New Class”命令,选择“Class type”为“Generic Class”,在“Name”栏中填入类名“CPublic”,单击“OK”,则新类建立完毕。
2、包含公用类的头文件,使各个类都能访问它
CPublic的头文件应包含在应用程序类的头文件中,这样在其它类中引用CPublic类时就不需要再包含了。
Test.h:(应用程序类头文件)
#include "Public.h" //包含公用类头文件
class CTestApp : public CWinApp
{
…………
};
3、在公用类中定义全局变量和全局函数,均使用static修饰,静态变量还必须在类外定义和初始化
Public.h:(公用类头文件)
class CPublic
{
public:
CPublic();
virtual ~CPublic();
public:
static int x; //全局变量
static int time; //全局变量
static int f(int y); //全局函数
…………
}
在公用类中对静态变量进行初始化和定义函数体:
Public.cpp:(公用类程序文件)
int CPublic::x = 0; //初始化全局变量
int CPublic::time; //定义全局变量
CPublic::CPublic()
{
}
CPublic::~CPublic()
{
}
int CPublic::f(int y) //全局函数,这里不要再加static
{
y++;
return y;
}
4、全局量的使用
使用变量:CPublic::变量名
使用函数:CPublic::函数()
如在视图的某函数中访问变量x和函数f():
void CTestView::xyz()
{
CPublic::x = 0; //访问变量x
CPublic::time = CPublic::f(1); //访问函数f()
…………
}
在其它类中访问x、time和f()的方法与此相同。
5、几点注意:
① 由于静态量可独立于类存在,不需要生成CPublic类的实例。
② 静态数据成员的定义和初始化必须在类外进行,如例中x的初始化;变量time虽然没有初始化,但也必须在类外进行定义。由于没有生成CPublic类的实例,所以它的构造函数和析构函数都不会被执行,在里面做什么工作都没有什么意义。
③ 如果静态函数需要访问CPublic类内的变量,这些变量也必须为静态的。因为非静态量在不生成实例时都不会存在。 如:
class CPublic
{
public:
int x; //内部变量
static int f(int y) //全局函数
{
x++;
return x;
};
…………
};
这里x虽为类内成员,但如果不生成CPublic类的实例,就会出现函数f()存在,而变量x不存在的问题。
总之,用没有实例的类管理全局量是一个不错的选择,它具有集中管理,使用方便的好处。当然,除非特别必要,全局量还是少用为好,一个好的编程者决不会随意滥用全局量的,一个封装做得不好的程序,在修改维护时会让你吃足苦头。
ps:直接在stdafx.h中加入#include"afxdb.h"。然后用Cdatabase db在该文件中定义就可以当全局变量使用了。不过不知道好不好,仅仅能用而已。有句话说的好,先要跑起来,再要求跑的快。呵呵,优化的前提"Get it to work,then make it fast."
也可以跟theApp定义在一块,在要引用全局变量的文件前面加extern声明;
ps2:
definition is similar to the first method,but how to use it is different
在CTestApp中定义变量:
CString g_sUser;//定义全局
在要引用的类中如此:
extern CTestApp theApp;//加入 这句.在.CPP文件的构造函数前.
在引用时:
if( theApp.m_gsUser == "") ;//这样引用.
全部回答
在类的重载中为了区分同名成员,调用哪一个,用::这个就可以调用基类的同名成员,不用则默认调用派生类的成员。也可以用来调用全局变量。其他时候如类的成员函数在外定义时表明身份。我就知道这些了
::表示这个函数是全局函数
如果你在一个类的成员函数里调用 MessageBox() ,这个函数可能是类的成员函数,各种继承下来的成员函数, 也可能是全局函数
用 xxx::MessageBox() 表明是从xxx继承下来的成员函数
用 ::MessageBox() 表明调用一个全局的函数, 而不是这个类的成员函数
::取全局作用域,对于MFC而言加了的是调用win api,不加的是调用mfc的库。一般调用win api的参数中会多个窗口或者DC句柄。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
apc ups怎么看生产日期
钟灵村地址在什么地方,我要处理点事
全旋律club外文动感音乐精选系列串烧dj candy
初瑜伽的位置在哪里?
什么叫在错的时间遇见很喜欢的人?
刀塔传奇魔像武者高分怎么打 魔像武者平民阵
香柏木的香味对人体有害吗
鹤城是哪儿
友爱在心中作文 500字
石灰窑子村地址在什么地方,想过去办事
副 开头的成语
阿芙荷荷巴营养保湿爽肤水,这个水怎么样,含
建行知音信用卡是金卡吗
菊花赞以象征手法300字
9×9是不是等于81
推荐资讯
银魂宇宙剑圣是第几集
傲娇这个词的解释
站到十里铺怎么坐公交车,最快需要多久
延边都有哪些民俗活动?
Java程序设计实用教程(第4版)
新白娘子传奇中小青与张玉堂认识是在哪一集
为什么噬菌体离心沉淀。沉淀下清液是DNA。而
我这个配置玩剑灵行么为什么我进去只有8帧
乐贝尔幼儿园(玉溪市新平县)地址在哪,我要去
这个是中蜂还是意蜂
新洪达汽配装潢店地址在什么地方,想过去办事
歼20能打得过F22吗
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?