vc++中Format函数详解Word文件下载.docx
《vc++中Format函数详解Word文件下载.docx》由会员分享,可在线阅读,更多相关《vc++中Format函数详解Word文件下载.docx(15页珍藏版)》请在冰豆网上搜索。
另:
问:
如何在VC++中使用全局变量,以使文档中的所有类都能访问。
答:
把该变量放到该应用程序类的头文件中的attribute处。
然后,在程序的任何地方,你都可以用下面的方法来访问该变量:
CMyApp*app=(CMyApp*)AfxGet-App();
app->
MyGlobalVariable=…
用这个方法,不但可以定义全局变量,也可以定义全局对象。
例如:
MyClassMyObject;
CMyApp*app=(CMyApp*)AfxGet-App();
MyObject.MyFunction();
VC中使用全局变量的2种办法及防错措施
1.对于全局变量存在和函数一样的问题,为了在其它CPP档中能够访问这些变量,必须在主文件的H檔中加上extern声明,格式如下:
externvaribletypevar;
(声明)
在主文件的CPP档中定义
varibletypevar;
(定义)
例子:
AppWizard建立一个Test工程
那么在Test.h中声明externCStringcs;
在Test.app定义CStringcs;
如果要定义整个工程的全局变量,在任何一个CPP档中进行定义,然后在需要引用这个变量的文件中进行声明。
如全局变量很多可以选择使用定义全局变量的。
h檔,在需要的地方直接include头档即可,不需要写那么多extern了。
2.应用程序类的主头文件处定义变量varibletypevar,然后,在程序的任何地方,都可以用下面的方法来访问该变量:
CClassApp*app=(CClassApp*)AfxGetApp();
var=
类似的,以上方法也可以定义全局对象
那么在Test.h中声明CStringcs;
使用的时候CTestApp*app=(CTestApp*)AfxGetApp();
app->
cs="
Global"
防错措施:
若定义的函数和全局变量在多个档包含且造成嵌套或多次调用的话,这样将导致这个头档每被包含依次,函数或变量就被重新定义一次,在链接编译时会导致重定义错误。
为此需要使用一种被称为Guardmacro的技术来保证不出错。
在一个头档开头加上
#ifndef_MACRO_1_
#define_MACRO_1_
在檔末尾增加
#endif
另外转一下一位朋友写的在MFC中定义全局变量
在MFC下如何定义全局变量和全局函数VC++
用MFC制作的工程由很多文件构成,它不能象一般C++程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特殊方法才行。
实际上有多种方法可以实现,这里只介绍两种方法。
一、在应用程序类中定义
用MFC生成的工程中都有一个名为CxxxApp的类,它派生于CWinApp类。
这个类主要进行程序的初始化,生成文文件、视图对象等工作。
我们可以把需要全局访问的变量和函数定义为这个类的成员变量和成员函数,就可以实现全局访问了。
从严格意义上讲,这种变量和函数并不是全局的,因为它仍然只是类中的成员,只是由于我们很容易获得CxxxApp类的指标,所以我们可以在文档、视图、对话框以及各种自定义类中访问到它们,达到与全局变量类似的效果。
访问时用函数“AfxGetApp()”获得CxxxApp类的指针,用“AfxGetApp()->
成员”访问变量或函数。
例:
Test.h:
(应用程序类头文件)
classCTestApp:
publicCWinApp
{
public:
intx;
//全局变量
intf(inty);
//全局函数
…………
};
Test.cpp:
(应用程序类程序文件)
intCTestApp:
:
f(inty)//全局函数定义
y++;
returny;
}
定义在CTestApp类中的变量和函数可以在其它类中被访问。
比如在视图的某函数中要访问变量x和函数f():
voidCTestView:
xyz()
CTestApp*app=(CTestApp*)AfxGetApp();
//生成指向应用程序类的指针
app->
x=0;
//访问变数x
intz=app->
f
(1);
//访问函数f()
这样,变量x和函数f()可以视作为全局的。
用这种方法实现的全局变量和全局函数虽比较简单,但也有缺点,一是访问不太方便,每次都需要获取应用程序类的指针;
再就是把一些与应用程序类本身无关的变量和函数放在里面,使这个类看上去怪怪的,破坏了类的封装。
二、用静态变量和静态函数实现
很喜欢API函数的那种调用方法,不论在哪个类中只要用“:
API函数”就可以调用了。
合理利用静态类型(static)可以实现与此相似的全局变量和全局函数。
静态变量和静态函数有如下性质:
若在一个类中用关键词static声明数据成员,则这个数据成员就只存在一个拷贝,无论该类创建了多少个实例,它始终只存在一个,即使该类的实例一个也没创建,它也存在。
若在一个类中用关键词static声明函数,该函数可以用“类名:
函数名”方式访问,无需引用该类的实例,甚至这个类的实例可以不存在。
利用这个性质实现的全局变量和函数使用起来很方便。
值得注意的是,全局变量和全局函数最好集中封装,不要在文档、视图等类内部定义,这样用起来才有全局的感觉。
1、添加一个没有基类的新类,设类名起为CPublic,姑且称之为公用类
单击“Insert”菜单下的“NewClass”命令,选择“Classtype”为“GenericClass”,在“Name”栏中填入类名“CPublic”,单击“OK”,则新类建立完毕。
2、包含公用类的头档,使各个类都能访问它
CPublic的头文件应包含在应用程序类的头文件中,这样在其它类中引用CPublic类时就不需要再包含了。
#include"
Public.h"
//包含公用类头档
3、在公用类中定义全局变量和全局函数,均使用static修饰,静态变量还必须在类外定义和初始化
Public.h:
(公用类头文件)
classCPublic
CPublic();
virtual~CPublic();
staticintx;
staticinttime;
staticintf(inty);
在公用类中对静态变量进行初始化和定义函数体:
Public.cpp:
(公用类程序文件)
intCPublic:
//初始化全局变量
time;
//定义全局变量
CPublic:
CPublic()
~CPublic()
f(inty)//全局函数,这里不要再加static
4、全局量的使用
使用变量:
变量名
使用函数:
函数()
如在视图的某函数中访问变量x和函数f():
time=CPublic:
在其它类中访问x、time和f()的方法与此相同。
5、几点注意:
①由于静态量可独立于类存在,不需要生成CPublic类的实例。
②静态数据成员的定义和初始化必须在类外进行,如例中x的初始化;
变量time虽然没有初始化,但也必须在类外进行定义。
由于没有生成CPublic类的实例,所以它的构造函数和析构函数都不会被执行,在里面做什么工作都没有什么意义。
③如果静态函数需要访问CPublic类内的变量,这些变量也必须为静态的。
因为非静态量在不生成实例时都不会存在。
如:
//内部变数
staticintf(inty)//全局函数
x++;
returnx;
这里x虽为类内成员,但如果不生成CPublic类的实例,就会出现函数f()存在,而变量x不存在的问题。
总之,用没有实例的类管理全局量是一个不错的选择,它具有集中管理,使用方便的好处。
当然,除非特别必要,全局量还是少用为好,一个好的编程者决不会随意滥用全局量的,一个封装做得不好的程序,在修改维护时会让你吃足苦头。
本文来自CSDN博客,转载请标明出处:
Format是一个很常用,却又似乎很烦的方法,以下是它的一些用法,以供大家查询之用:
Format是Cstring类的一个经常使用的成员函数,它通过格式操作使任意类型的数据转换成一个字符串.
首先看它的声明:
functionFormat(constFormat:
string;
constArgs:
arrayofconst):
overload;
事实上Format方法有两个种形式,另外一种是三个参数的,主要区别在于它是线程安全的,
但并不多用,所以这里只对第一个介绍:
Format参数是一个格式字符串,用于格式化Args里面的值的。
Args又是什么呢,
它是一个变体数组,即它里面可以有多个参数,而且每个参数可以不同。
如以下例子:
Format('
mynameis%6s'
['
wind'
]);
返回后就是
mynameiswind
现在来看Format参数的详细情况:
Format里面可以写普通的字符串,比如'
mynameis'
但有些格式指令字符具有特殊意义,比如"
%6s"
格式指令具有以下的形式:
"
%"
[index"
]["
-"
][width]["
."
prec]type
它是以"
开始,而以type结束,type表示一个具体的类型。
中间是用来
格式化type类型的指令字符,是可选的。
先来看看type,type可以是以下字符:
d十制数,表示一个整型值
u和d一样是整型值,但它是无符号的,而如果它对应的值是负的,则返回时
是一个2的32次方减去这个绝对值的数
如:
thisis%u'
[-2]);
返回的是:
thisis4294967294
f对应浮点数
e科学表示法,对应整型数和浮点数,
比如Format('
thisis%e'
[-2.22]);
thisis-2.22000000000000E+000
等一下再说明如果将数的精度缩小
g这个只能对应浮点型,且它会将值中多余的数去掉
thisis%g'
[02.200]);
thisis2.2
n只能对应浮点型,将值转化为号码的形式。
看一个例子就明白了
thisis%n'
[4552.2176]);
返回的是thisis4,552.22
注意有两点,一是只表示到小数后两位,等一下说怎么消除这种情况
二是,即使小数没有被截断,它也不会也像整数部分一样有逗号来分开的
m钱币类型,但关于货币类型有更好的格式化方法,这里只是简单的格式化
另外它只对应于浮点值
thisis%m'
[9552.21]);
返回:
thisis¥9,552.21
p对应于指针类型,返回的值是指针的地址,以十六进制的形式来表示
例如:
varX:
integer;
p:
^integer;
begin
X:
=99;
=@X;
Edit1.Text:
=Format('
thisis%p'
[p]);
end;
Edit1的内容是:
thisis0012F548
s对应字符串类型,不用多说了吧
x必须是一个整形值,以十六进制的形式返回
thisis%X'
[15]);
返回是:
thisisF
类型讲述完毕,下面介绍格式化Type的指令:
[index"
]这个要怎么表达呢,看一个例子
thisis%d%d'
[12,13]);
其中第一个%d的索引是0,第二个%d是1,所以字符显示的时候
是这样thisis1213
而如果你这样定义:
thisis%1:
d%0:
d'
那么返回的字符串就变成了
thisis1312
现在明白了吗,[index"
]中的index指示Args中参数显示的
顺序
还有一种情况,如果这样Format('
%d%d%d%0:
d%d'
[1,2,3,4])
将返回12312。
如果你想返回的是12314,必须这样定:
d%3:
但用的时候要注意,索引不能超出Args中的个数,不然会引起异常
如Format('
thisis%2:
由于Args中只有1213两个数,所以Index只能是0或1,这里为2就错了
[width]指定将被格式化的值占的宽度,看一个例子就明白了
thisis%4d'
[12]);
输出是:
thisis12
这个是比较容易,不过如果Width的值小于参数的长度,则没有效果。
thisis%1d'
["
]这个指定参数向左对齐,和[width]合在一起就可以看到效果:
thisis%-4d,yes'
thisis12,yes
prec]指定精度,对于浮点数效果最佳:
thisis%.2f'
1.1234]);
输出thisis1.12
thisis%.7f'
输了thisis1.1234000
而对于整型数,如果prec比如整型的位数小,则没有效果
反之比整形值的位数大,则会在整型值的前面以0补之
thisis%.7d'
[1234]);
thisis0001234]
对于字符型,刚好和整型值相反,如果prec比字符串型的长度大
则没有效果,反之比字符串型的长度小,则会截断尾部的字符
thisis%.2s'
1234'
输出是thisis12
而上面说的这个例子:
怎么去掉多余的0呢,这个就行啦
thisis%.2e'
一、字符串
事实上Format方法有两个种形式,另外一种是三个参数的,主要区别在于它是线程安全的,
Args又是什么呢,
Format("
mynameis%6s"
"
wind"
);
返回后就是
mynameiswind
Format里面可以写普通的字符串,比如"
mynameis"
prec]type
中间是用来
d十制数,表示一个整型值
u和d一样是整型值,但它是无符号的,而如果它对应的值是负的,则返回时
是一个2的32次方减去这个绝对值的数
thisis%u"
-2);
thisis4294967294
f对应浮点数
e科学表示法,对应整型数和浮点数,
比如Format("
thisis%e"
-2.22);
thisis-2.220000E+000
等一下再说明如果将数的精度缩小
g这个只能对应浮点型,且它会将值中多余的数去掉
thisis%g"
02.200);
thisis2.2
看一个例子就明白了
thisis%n"
4552.2176);
返回的是thisis4,552.22
注意有两点,一是只表示到小数后两位,等一下说怎么消除这种情况
二是,即使小数没有被截断,它也不会也像整数部分一样有逗号来分开的
m钱币类型,但关于货币类型有更好的格式化方法,这里只是简单的格式化
另外它只对应于浮点值
thisis%m"
9552.21);
thisis¥9,552.21
p对应于指针类型,返回的值是指针的地址,以十六进制的形式来表示
thisis%p"
p);
thisis0012F548
s对应字符串类型,不用多说了吧
x必须是一个整形值,以十六进制的形式返回
thisis%X"
15);
thisisF
]这个要怎么表达呢,看一个例子
thisis%d%d"
12,13);
其中第一个%d的索引是0,第二个%d是1,所以字符显示的时候
是这样thisis1213
d"
那么返回的字符串就变成了
thisis1312
]中的index指示Args中参数显示的
顺序
还有一种情况,如果这样Format("
d%d"
1,2,3,4);
但用的时候要注意,索引不能超出Args中的个数,不然会引起异常
如Format("
由于Args中只有1213两个数,所以Index只能是0或1,这里为2就错了
[width]指定将被格式化的值占的宽度,看一个例子就明白了
thisis%4d"
12);
thisis12
thisis%1d"
]这个指定参数向左齐,和[width]合在一起最可以看到效果:
thisis%-4d,yes"
thisis12,yes
输出thisis1.12
输了thisis1.1234000
而对于整型数,如果prec比如整型的位数小,则没有效果
反之比整形值的位数大,则会在整型值的前面以0补之
thisis0001234]
对于字符型,刚好和整型值相反,如果prec比字符串型的长度大
则没有效果,反之比字符串型的长度小,则会截断尾部的字符
]