??xml version="1.0" encoding="utf-8" standalone="yes"?>
q是More Effecitve C++里的W二条对cd转换讲的很好Q也很基好懂?br />Item M2Q尽量用C++风格的类型{?br />仔细xC卑贱的类型{换功能(castQ,其在E序设计中的Cpgoto语句一样o(h)人鄙视。但是它q不是无法o(h)人忍受,因ؓ(f)当在某些紧要的关_(d)cd转换q是必需的,q时它是一个必需品?br />不过C风格的类型{换ƈ不代表所有的cd转换功能?br />一来它们过于粗鲁,能允怽在Q何类型之间进行{换。不q如果要q行更精的cd转换Q这?x)是一个优炏V在q些cd转换中存在着巨大的不同,例如把一个指?const对象的指针(pointer-to-const-objectQ{换成指向非const对象的指针(pointer-to-non-const -objectQ?即一个仅仅去除const的类型{?Q把一个指向基cȝ指针转换成指向子cȝ指针Q即完全改变对象cdQ。传l的C风格的类型{换不对上qCU{换进行区分。(q一点也不o(h)人惊Ӟ因ؓ(f)C风格的类型{换是为C语言设计的,而不是ؓ(f)C++语言设计的)(j)?br />二来C风格的类型{换在E序语句中难以识别。在语法上,cd转换由圆括号和标识符l成Q而这些可以用在CQ+中的M地方。这使得回答象这样一个最基本的有关类型{换的问题变得很困难:(x)“在q个E序中是否用了(jin)cd转换Q”。这是因Zh工阅d可能忽略?jin)类型{换的语句Q而利用象grep的工L(fng)序也不能从语句构成上区分出它们来?br />C++通过引进四个新的cd转换操作W克服了(jin)C风格cd转换的缺点,q四个操作符? static_cast, const_cast, dynamic_cast, 和reinterpret_cast。在大多数情况下Q对于这些操作符你只需要知道原来你?fn)惯于这样写Q?br />(type) expression
In C++ it is possible to declare constructors for a class, taking a single parameter, and use those constructors for doing type conversion. For example:
However, this type of implicit conversion can be confusing, and there is a way of disabling it, using a new keyword "explicit" in the constructor declaration:
Note that an expression such as:
is closely related to function-style casts supported by C++. For example:
而现在你d该这样写Q?br />static_cast<type>(expression)
例如Q假设你x一个int转换成doubleQ以便让包含intcd变量的表辑ּ产生出QҎ(gu)值的l果。如果用C风格的类型{换,你能q样写:(x)
int firstNumber, secondNumber;
...
double result = ((double)firstNumber)/secondNumberQ?br />如果用上q新的类型{换方法,你应该这样写Q?br />double result = static_cast<double>(firstNumber)/secondNumber;
q样的类型{换不论是对h工还是对E序都很Ҏ(gu)识别?br />static_cast 在功能上基本上与C风格的类型{换一样强大,含义也一栗它也有功能上限制。例如,你不能用static_cast象用C风格的类型{换一h struct转换成intcd或者把doublecd转换成指针类型,另外Qstatic_cast不能从表辑ּ中去除const属性,因ؓ(f)另一个新的类型{换操作符const_cast有这L(fng)功能?br />其它新的C++cd转换操作W被用在需要更多限制的地方。const_cast用于cd转换掉表辑ּ的const或volatileness属性。通过使用const_castQ你向h们和~译器强调你通过cd转换惛_的只是改变一些东西的 constness或者volatileness属性。这个含义被~译器所U束。如果你试图使用const_cast来完成修改constness 或者volatileness属性之外的事情Q你的类型{换将被拒l。下面是一些例子:(x)
class Widget { ... };
class SpecialWidget: public Widget { ... };
void update(SpecialWidget *psw);
SpecialWidget sw; // sw 是一个非const 对象?br />const SpecialWidget& csw = sw; // csw 是sw的一个引?br />// 它是一个const 对象
update(&csw); // 错误!不能传递一个const SpecialWidget* 变量
// l一个处理SpecialWidget*cd变量的函?br />update(const_cast<SpecialWidget*>(&csw));
// 正确Qcsw的const被显C地转换掉(
// csw和sw两个变量值在update
//函数中能被更斎ͼ(j)
update((SpecialWidget*)&csw);
// 同上Q但用了(jin)一个更难识?br />//的C风格的类型{?br />Widget *pw = new SpecialWidget;
update(pw); // 错误Qpw的类型是Widget*Q但?br />// update函数处理的是SpecialWidget*cd
update(const_cast<SpecialWidget*>(pw));
// 错误Qconst_cast仅能被用在媄(jing)?br />// constness or volatileness的地方上?
// 不能用在向承子c进行类型{换?br />到目前ؓ(f)止,const_cast最普通的用途就是{换掉对象的const属性?br />W二U特D的cd转换W是dynamic_castQ它被用于安全地沿着cȝl承关系向下q行cd转换。这是_(d)你能用dynamic_cast把指向基cȝ指针或引用{换成指向其派生类或其兄弟cȝ指针或引用,而且你能知道转换是否成功。失败的转换返回空指针Q当Ҏ(gu)针进行类型{换时Q或者抛出异常(当对引用q行cd转换Ӟ(j)Q?br />Widget *pw;
...
update(dynamic_cast<SpecialWidget*>(pw));
// 正确Q传递给update函数一个指?br />// 是指向变量类型ؓ(f)SpecialWidget的pw的指?br />// 如果pw实指向一个对?
// 否则传递过ȝɽI指针?br />void updateViaRef(SpecialWidget& rsw);
updateViaRef(dynamic_cast<SpecialWidget&>(*pw));
//正确。传递给updateViaRef函数
// SpecialWidget pw 指针Q如果pw
// 实指向?jin)某个对?br />// 否则抛出异?br />dynamic_casts在帮助你览l承层次上是有限制的。它不能被用于缺乏虚函数的类型上Q参见条ƾM24Q,也不能用它来转换掉constnessQ?br />int firstNumber, secondNumber;
...
double result = dynamic_cast<double>(firstNumber)/secondNumber;
// 错误Q没有承关p?br />const SpecialWidget sw;
...
update(dynamic_cast<SpecialWidget*>(&sw));
// 错误! dynamic_cast不能转换
// 掉const?br />如你惛_没有l承关系的类型中q行转换Q你可能惛_static_cast。如果是Z(jin)去除constQ你d用const_cast?br />q四个类型{换符中的最后一个是reinterpret_cast。用这个操作符的类型{换,其的转换l果几乎都是执行期定义(implementation-definedQ。因此,使用reinterpret_casts的代码很隄植?br />reinterpret_casts的最普通的用途就是在函数指针cd之间q行转换。例如,假设你有一个函数指针数l:(x)
typedef void (*FuncPtr)(); // FuncPtr is 一个指向函?br />// 的指针,该函数没有参?br />// q回值类型ؓ(f)void
FuncPtr funcPtrArray[10]; // funcPtrArray 是一个能容纳
// 10个FuncPtrs指针的数l?br />让我们假设你希望Q因为某些莫名其妙的原因Q把一个指向下面函数的指针存入funcPtrArray数组Q?br />int doSomething();
你不能不l过cd转换而直接去做,因ؓ(f)doSomething函数对于funcPtrArray数组来说有一个错误的cd。在FuncPtrArray数组里的函数q回值是voidcdQ而doSomething函数q回值是intcd?br />funcPtrArray[0] = &doSomething; // 错误Q类型不匚w
reinterpret_cast可以让你qɾ~译器以你的Ҏ(gu)ȝ待它们:(x)
funcPtrArray[0] = // this compiles
reinterpret_cast<FuncPtr>(&doSomething);
转换函数指针的代码是不可UL的(C++不保证所有的函数指针都被用一L(fng)Ҏ(gu)表示Q,在一些情况下q样的{换会(x)产生不正的l果Q参见条ƾM31Q,所以你应该避免转换函数指针cdQ除非你处于着背水一战和刀架喉的危急时刅R一把锋利的刀。一把非帔R利的刀?br />如果你用的~译器缺乏对新的cd转换方式的支持,你可以用传统的类型{换方法代替static_cast, const_cast, 以及(qing)reinterpret_cast。也可以用下面的宏替换来模拟新的cd转换语法Q?br />#define static_cast(TYPE,EXPR) ((TYPE)(EXPR))
#define const_cast(TYPE,EXPR) ((TYPE)(EXPR))
#define reinterpret_cast(TYPE,EXPR) ((TYPE)(EXPR))
你可以象q样使用使用Q?br />double result = static_cast(double, firstNumber)/secondNumber;
update(const_cast(SpecialWidget*, &sw));
funcPtrArray[0] = reinterpret_cast(FuncPtr, &doSomething);
q些模拟不会(x)象真实的操作W一样安全,但是当你的编译器可以支持新的的类型{换时Q它们可以简化你把代码升U的q程?br />没有一个容易的Ҏ(gu)来模拟dynamic_cast的操作,但是很多函数库提供了(jin)函数Q安全地在派生类与基cM间进行类型{换。如果你没有q些函数而你有必进行这L(fng)cd转换Q你也可以回到C风格的类型{换方法上Q但是这L(fng)话你不能获知类型{换是否失败。当?dng)你也可以定义一个宏来模?dynamic_cast的功能,p模拟其它的类型{换一P(x)
#define dynamic_cast(TYPE,EXPR) (TYPE)(EXPR)
误住,q个模拟q不能完全实现dynamic_cast的功能,它没有办法知道{换是否失败?br />我知道,是的Q我知道Q新的类型{换操作符不是很美观而且用键盘键入也很麻?ch)。如果你发现它们看上d在o(h)厌,C风格的类型{换还可以l箋使用q且合法。然而,正是因ؓ(f)新的cd转换W缺乏美感才能它I补了(jin)在含义精性和可L认性上的缺炏Vƈ且,使用新类型{换符的程序更Ҏ(gu)被解析(不论是对人工q是对于工具E序Q,它们允许~译器检出原来不能发现的错误。这些都是放弃C风格cd转换Ҏ(gu)的强有力的理由。还有第三个理由Q也许让cd转换W不观和键入麻?ch)是一件好事?
]]>
public
:
A(
int
);
};
void
f(A) {}
void
g()
{
A a1
=
37
;
A a2
=
A(
47
);
A a3(
57
);
a1
=
67
;
f(
77
);
}
A declaration like:
A a1 = 37;
says to call the A(int) constructor to create an A object from
the integer value. Such a constructor is called a "converting
constructor".
Using the explicit keyword, a constructor is declared to be
public
:
explicit
A(
int
);
};
void
f(A) {}
void
g()
{
A a1
=
37
;
//
illegal
A a2
=
A(
47
);
//
OK
A a3(
57
);
//
OK
a1
=
67
;
//
illegal
f(
77
);
//
illegal
}
"nonconverting", and explicit constructor syntax is required:
public
:
explicit
A(
int
);
};
void
f(A) {}
void
g()
{
A a1
=
A(
37
);
A a2
=
A(
47
);
A a3(
57
);
a1
=
A(
67
);
f(A(
77
));
}
A(47)
double d = 12.34;
int i = int(d);
]]>
在C++中,有一个streamq个c,所有的I/O都以q个“流”类为基的,包括我们要认识的文gI/OQstreamq个cL两个重要的运符Q?
1、插入器(<<)
向流输出数据。比如说pȝ有一个默认的标准输出?cout)Q一般情况下是指的昄器,所以,cout<<"Write Stdout"<<'\n';pC把字符?Write Stdout"和换行字W?'\n')输出到标准输出流?
2、析取器(>>)
从流中输入数据。比如说pȝ有一个默认的标准输入?cin)Q一般情况下是指的键盘Q所以,cin>>x;pCZ标准输入中d一个指定类?卛_量x的类?的数据?
在C++中,Ҏ(gu)件的操作是通过stream的子cfstream(file stream)来实现的Q所以,要用q种方式操作文gQ就必须加入头文件fstream.h。下面就把此cȝ文g操作q程一一道来?
一、打开文g
在fstreamcMQ有一个成员函数open()Q就是用来打开文g的,其原型是Q?
void open(const char* filename,int mode,int access);
参数Q?
filenameQ 要打开的文件名
modeQ 要打开文g的方?
accessQ 打开文g的属?
打开文g的方式在cios(是所有流式I/Ocȝ基类)中定义,常用的值如下:(x)
ios::appQ 以追加的方式打开文g
ios::ateQ 文g打开后定位到文g,ios:app包含有此属?
ios::binaryQ? 以二q制方式打开文gQ缺省的方式是文本方式。两U方式的区别见前?
ios::inQ 文g以输入方式打开
ios::outQ 文g以输出方式打开
ios::nocreateQ?不徏立文Ӟ所以文件不存在时打开p|
ios::noreplaceQ不覆盖文gQ所以打开文g时如果文件存在失?
ios::truncQ 如果文g存在Q把文g长度设ؓ(f)0
可以用“或”把以上属性连接v来,如ios::out|ios::binary
打开文g的属性取值是Q?
0Q普通文Ӟ打开讉K
1Q只L?
2Q隐含文?
4Q系l文?
可以用“或”或者?”把以上属性连接v?Q如3?|2是以只d隐含属性打开文g?
例如Q以二进制输入方式打开文gc:\config.sys
fstream file1;
file1.open("c:\\config.sys",ios::binary|ios::in,0);
如果open函数只有文g名一个参敎ͼ则是以读/写普通文件打开Q即Q?
file1.open("c:\\config.sys");<=>file1.open("c:\\config.sys",ios::in|ios::out,0);
另外Qfstreamq有和open()一L(fng)构造函敎ͼ对于上例Q在定义的时侯就可以打开文g?jin)?x)
fstream file1("c:\\config.sys");
特别提出的是Qfstream有两个子c:(x)ifstream(input file stream)和ofstream(outpu file stream)Qifstream默认以输入方式打开文gQ而ofstream默认以输出方式打开文g?
ifstream file2("c:\\pdos.def");//以输入方式打开文g
ofstream file3("c:\\x.123");//以输出方式打开文g
所以,在实际应用中Q根据需要的不同Q选择不同的类来定义:(x)如果想以输入方式打开Q就用ifstream来定义;如果想以输出方式打开Q就用ofstream来定义;如果想以输入/输出方式来打开Q就用fstream来定义?
二、关闭文?
打开的文件用完成后一定要关闭Qfstream提供?jin)成员函数close()来完成此操作Q如Qfile1.close();把file1相连的文件关闭?
三、读写文?
d文g分ؓ(f)文本文g和二q制文g的读取,对于文本文g的读取比较简单,用插入器和析取器可以了(jin)Q而对于二q制的读取就要复杂些Q下要就详细的介l这两种方式
1、文本文件的d
文本文g的读写很单:(x)用插入器(<<)向文件输出;用析取器(>>)从文件输入。假设file1是以输入方式打开Qfile2以输出打开。示例如下:(x)
file2<<"I Love You";//向文件写入字W串"I Love You"
int i;
file1>>i;//从文件输入一个整数倹{?
q种方式q有一U简单的格式化能力,比如可以指定输出?6q制{等Q具体的格式有以下一?
操纵W?功能 输入/输出
dec 格式化ؓ(f)十进制数值数?输入和输?
endl 输出一个换行符q刷新此?输出
ends 输出一个空字符 输出
hex 格式化ؓ(f)十六q制数值数?输入和输?
oct 格式化ؓ(f)八进制数值数?输入和输?
setpxecision(int p) 讄点数的_ֺ位数 输出
比如要把123当作十六q制输出Qfile1<<<123;要把3.1415926?位精度输出:(x)FILE1<
2、二q制文g的读?
①put()
put()函数向流写入一个字W,其原型是ofstream &put(char ch)Q用也比较单,如file1.put('c');是向流写一个字W?c'?
②get()
get()函数比较灉|Q有3U常用的重蝲形式Q?
一U就是和put()对应的Ş式:(x)ifstream &get(char &ch);功能是从中d一个字W,l果保存在引用ch中,如果到文件尾Q返回空字符。如file2.get(x);表示从文件中d一个字W,q把d的字W保存在x中?
另一U重载Ş式的原型是:(x) int get();q种形式是从中q回一个字W,如果到达文g,q回EOFQ如x=file2.get();和上例功能是一L(fng)?
q有一UŞ式的原型是:(x)ifstream &get(char *buf,int num,char delim='\n')Q这UŞ式把字符d?buf 指向的数l,直到d?num 个字W或遇到?jin)?delim 指定的字W,如果没?delim q个参数Q将使用~省值换行符'\n'。例如:(x)
file2.get(str1,127,'A');//从文件中d字符到字W串str1Q当遇到字符'A'或读取了(jin)127个字W时l止?
③读写数据块
要读写二q制数据块,使用成员函数read()和write()成员函数Q它们原型如下:(x)
read(unsigned char *buf,int num);
write(const unsigned char *buf,int num);
read()从文件中d num 个字W到 buf 指向的缓存中Q如果在q未d num 个字W时到?jin)文件尾Q可以用成员函数 int gcount();来取得实际读取的字符敎ͼ?write() 从buf 指向的缓存写 num 个字W到文g中,值得注意的是~存的类型是 unsigned char *Q有时可能需要类型{换?
例:(x)
unsigned char str1[]="I Love You";
int n[5];
ifstream in("xxx.xxx");
ofstream out("yyy.yyy");
out.write(str1,strlen(str1));//把字W串str1全部写到yyy.yyy?
in.read((unsigned char*)n,sizeof(n));//从xxx.xxx中读取指定个整数Q注意类型{?
in.close();out.close();
四、检EOF
成员函数eof()用来(g)是否到达文件尾Q如果到达文件尾q回?|否则q回0。原型是int eof();
例:(x) if(in.eof())ShowMessage("已经到达文g!");
五、文件定?
和C的文件操作方式不同的是,C++ I/Opȝ理两个与一个文件相联系的指针。一个是L针,它说明输入操作在文g中的位置Q另一个是写指针,它下ơ写操作的位|。每ơ执行输入或输出Ӟ相应的指针自动变化。所以,C++的文件定位分位置和写位置的定位,对应的成员函数是 seekg()?seekp()Qseekg()是设|读位置Qseekp是设|写位置。它们最通用的Ş式如下:(x)
istream &seekg(streamoff offset,seek_dir origin);
ostream &seekp(streamoff offset,seek_dir origin);
streamoff定义?iostream.h 中,定义有偏U量 offset 所能取得的最大|seek_dir 表示Ud的基准位|,是一个有以下值的枚DQ?
ios::begQ 文g开?
ios::curQ 文g当前位置
ios::endQ 文gl尾
q两个函C般用于二q制文gQ因为文本文件会(x)因ؓ(f)pȝ对字W的解释而可能与预想的g同?
例:(x)
file1.seekg(1234,ios::cur);//把文件的L针从当前位置向后U?234个字?
file2.seekp(1234,ios::beg);//把文件的写指针从文g开头向后移1234个字?/setpxecision(5)>
]]>
例如
template<typename T>
inline T const & max(T const &a,T const &b)
{
return a>b?a:b;
}
2.Function template可以从传递过来的arguments的类型来具体?br />int a = ::max(10,20);
那么F(tun)unction template 具体化?br />inline int const& max(int const &a,int const & b)
3.你可以具体指出它的参数类?br />int a = ::max<int>(10,20);
4.Function template可以被重载overloaded
inline T const& max(T const &a,T const &b,T const &c)
{
return ::max(::max(a,b),c);
}
当然C一点,重蝲的相似点小好
]]>
http://community.csdn.net/Expert/topic/5279/5279199.xml?temp=.2457392
在文章中大家在讨Z个问?
如果没有存储上没有区别的?L(fng)下例Q?br />float a=3.45;
int * p1=&a;
float * p2=&a;
cout<<"p1"<<"=>"<<*p1<<endl;
cout<<"p2"<<"=>"<<*p2<<endl;
l果是:(x)
p1=>1107951616
p2=>3.45
书上的解释是Qp1管与p2的地址相同Q但它是整型指针Q它L讉K该地址中的整型数?br />首先?2位CPU上面,指针都是4位的,例如0xXX XX XX XX
那么既然指针是一L(fng),那么Z么指针类型不同的?d来的数据变?jin)样?
q是~译器的问题,例如我有个例?br />
char *p = 'c';
int *p1 = 10;
?2位机器上?br />q里面p1是指?字节的int变量,而p是指?字节的char 变量
q样~译器在用p1变量的时??x)?x XX XX XX XX后面?个字?br />而p变量,只会(x)?x XX XX XX XX后面?个字?br />
因ؓ(f)本h现在在网吧里面[不知道大家有没有在网吧里面碰到装有c++~译器的计算机]
晚上我给大家一个例?可以从其内存上面看的很清?/font>
lc++E序员的一份礼物——常用工具集
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
所?工欲善其事,必先利其?Q从E序员的角度来讲Q好工具的用M(x)lh带来事半功倍的效果。面对众多工?软gQ我们应该如何取舍呢。前不久Q笔者在csdn的c++论坛发了(jin)一?/font> 贴文 Q以期能征求大家的广泛意见,得到?jin)不错的反响。本文在对该贴进行整理的基础上,又做?jin)一些补充。在q里要特别感谢网友:(x)DanielWYO(׃白)Qredleaves(无心(j)U叶)? 有以下几炚w要声明:(x)
开发环?/font>
辅助
E序~辑?/font>
UML/建模
版本控制
其他的版本管理工兯包括QPVCS、VCS、RCS{? XML
试
其他的Rational试工具q包括:(x)TestFactory、PureCoverage、TestManager{? 日志
注释
|
void main()
{
char *str = NULL;
GetMemory(str,100);
strcpy(str,"Hello World");//出错
}
首先我们先看看asm
004010B8 mov dword ptr [ebp-4],0
004010BF push 64h
004010C1 mov eax,dword ptr [ebp-4]
004010C4 push eax
004010C5 call @ILT+50(GetMemory) (00401037)
str 地址:12FF7C
其副本地址:12FF28
在存入参数的时?同时都指?0 00 00 00
在执行p = (char*)malloc(sizeof(char)*num);之后
12FF28指向的内容变成了(jin)20 1C 43 00?
林锐博士在这边的意思是只用指向指针的指?q种Ҏ(gu)我们在第二种Ҏ(gu)U介l?
下面l出我的一U看?大家觉得好不?br />我的Ҏ(gu):
char *GetMemory(char *p,int num)
{
p = (char*)malloc(sizeof(char)*num);
return p;
}
void main()
{
char *str = NULL;
str = GetMemory(str,100);
strcpy(str,"Hello World");
cout<<str<<endl;
}
可以化ؓ(f):
char *GetMemory(int num)
{
char *p = (char*)malloc(sizeof(char)*num);
return p;
}
void main()
{
char *str = NULL;
str = GetMemory(100);
strcpy(str,"Hello World");
cout<<str<<endl;
}
林锐博士的看?
void GetMemory(char **p,int num)
{
*p = (char*)malloc(sizeof(char)*num);
}
void main()
{
char *str = NULL;
GetMemory(&str,100);
strcpy(str,"Hello,World");
cout <<str<<endl;
}
设计更多的语法的a论。现实中QC++的库门类J多Q解决的问题也是极其q泛Q库从轻量到重量
的都有。不都是让人眼界大开Q亦或是望而生叹的思维C。由于库的数量非常庞大,而且限于W?/font>
水^Q其中很多ƈ不了(jin)解。所以文中所提的一些库都是比较著名的大型库?/font>
标准?/font>
标准库中提供?jin)C++E序的基本设施。虽然C++标准库随着C++标准折腾?jin)许多年Q直到标准的出台才正
式定型,但是在标准库的实C却很令hƣ慰得看到多U实玎ͼq且已被实践证明为有工业U别强度?/font>
佳作?/font>
1、 ?Dinkumware C++ Library
参考站点:(x) http://www.dinkumware.com
P.J. Plauger~写的高品质的标准库。P.J. Plauger博士是Dr. Dobb'sE序设计杰出奖的获得者。其~?/font>
写的库长期被Microsoft采用Qƈ且最qB(ti)orland也取得了(jin)其OEM的licenseQ在其C/C++的品中采用
Dinkumware的库?/font>
2、 ?RogueWave Standard C++ Library
参考站点:(x) http://www.roguewave.com/
q个库在Borland C++ Builder的早期版本中曄被采用,后来被其他的库给替换?jin)。笔者不推荐 ?/font>
3、SGI STL
参考站点:(x) http://www.roguewave.com/
SGI公司的C++标准模版库?/font>
4、STLport
参考站点:(x) http://www.stlport.org
SGI STL库的跨^台可UL版本?/font>
准标准库——Boost
Boost库是一个经q千锤百点{可UL、提供源代码的C++库,作ؓ(f)标准库的后备Q是C++标准化进E的
发动Z一?Boost库由C++标准委员?x)库工作l成员发P在C++C中媄(jing)响甚大,其成员已q?000?/font>
?Boost库ؓ(f)我们带来?jin)最新、最酗最实用的技术,是不折不扣的“准”标准库?/font>
Boost中比较有名气的有q么几个库:(x)
Regex
正则表达式库
Spirit
LL parser frameworkQ用C++代码直接表达EBNF
Graph
囄件和法
Lambda
在调用的地方定义短小匿名的函数对象,很实用的functional功能
concept check
(g)查泛型编E中的concept
Mpl
用模板实现的元编E框?/font>
Thread
可移植的C++多线E库
Python
把C++cd函数映射到Python之中
Pool
内存池管?/font>
smart_ptr
5个智能指针,学习(fn)指针必读Q一份不错的参考是来自CUJ的文章:(x)
Smart Pointers in Boost,哦,q篇文章可以查到QCUJ是提供在U浏览的。中文版见笔者在《Dr.
Dobb's Journal软g研发杂志》第7辑上的译文?/font>
BoostM来说是实用h(hun)值很高,质量很高的库。ƈ且由于其对跨q_的强调,Ҏ(gu)准C++的强调,是编
写^台无养ICC++的开发者必备的工具。但是Boost中也有很多是实验性质的东西,在实际的开发中
实用需要}慎。ƈ且很多Boost中的库功能堪U对语言功能的扩展,其构造用精巧的手法Q不要N?/font>
的花Ҏ(gu)间研诅RBoost另外一面,比如Graphq样的库则是h工业强度Q结构良好,非常值得研读?/font>
_֓代码Qƈ且也可以攑ֿ(j)的在产品代码中多多利用?/font>
参考站点:(x)
http://www.boost.org
Q国内镜像:(x)
http://www.c-view.org/tech/lib/boost/index.htm
Q?/font>
GUI
在众多C++的库中,GUI部分的库是比较J荣Q也比较引h注目的。在实际开发中QGUI库的选择也是
非常重要的一件事情,下面我们lD一下可选择的GUI库,各自的特点以?qing)相兛_L(fng)支持?/font>
1、 ?MFC
大名鼎鼎的微软基cdQMicrosoft Foundation ClassQ。大凡学qVC++的h都应该知道这个库。虽
然从技术角度讲QMFC是不大漂亮的Q但是它构徏于Windows API 之上Q能够ɽE序员的工作更容?~?/font>
E效率高Q减了(jin)大量在徏?Windows E序时必ȝ写的代码Q同时它q提供了(jin)所有一?C++ ~程?/font>
优点Q例如承和装。MFC ~写的程序在各个版本的Windows操作pȝ上是可移植的Q例如,?
Windows 3.1下编写的代码可以很容易地UL?Windows NT ?Windows 95 上。但是在最q发展以?/font>
官方支持上日渐势微?/font>
2、 ?QT
参考网站:(x)http://www.trolltech.com/
Qt是Trolltech公司的一个多q_的C++囑Ş用户界面应用E序框架。它提供l应用程序开发者徏立艺?/font>
U的囑Ş用户界面所需的所用功能。Qt是完全面向对象的很容易扩展,q且允许真正地组件编E。自?/font>
1996q早些时候,Qtq入商业领域Q它已经成ؓ(f)全世界范围内数千U成功的应用E序的基。Qt也是?/font>
行的Linux桌面环境KDE 的基Q同时它q支持Windows、Macintosh、Unix/X11{多U^台?/font>
3、WxWindows
参考网站:(x)http://www.wxwindows.org/
跨^台的GUI库。因为其cdơ极像MFCQ所以有文章介绍从MFC到WxWindows的代码移植以实现跨^台的
功能。通过多年的开发也是一个日完善的GUI库,支持同样不弱于前面两个库。ƈ且是完全开放源?/font>
码的。新q的C++ Builder X的GUI设计器就是基于这个库的?/font>
4、Fox
参考网站:(x)http://www.fox-toolkit.org/
开放源代码的GUI库。作者从自己亲n的开发经验中得出?jin)一个理想的GUI库应该是什么样子的感受出发
Q从而开始了(jin)对这个库的开发。有兴趣的可以尝试一下?/font>
5、WTL
ZATL的一个库。因Z用了(jin)大量ATL的轻量手法Q模板等技术,在代码尺寸,以及(qing)速度优化斚w?/font>
得非常到位。主要面向的使用体是开发COM轻量U供|络下蝲的可视化控g的开发者?/font>
6、GTK
参考网站:(x)http://gtkmm.sourceforge.net/
GTK是一个大名鼎鼎的C的开源GUI库。在Linux世界中有Gnomeq样的杀手应用。而GTK是q个库的C++
装版本?/font>
|络通信
ACE
参考网站:(x)http://www.cs.wustl.edu/~schmidt/ACE.html
C++库的代表Q超重量U的|络通信开发框架。ACE自适配通信环境QAdaptive Communication
EnvironmentQ是可以自由使用、开放源代码的面向对象框Ӟ在其中实C(jin)许多用于q发通信软g?/font>
核心(j)模式。ACE提供?jin)一l丰富的可复用C++包装外观QWrapper FacadeQ和框架lgQ可跨越多种q_
完成通用的通信软gdQ其中包括:(x)事g多\分离和事件处理器分派、信号处理、服务初始化、进E?/font>
间通信、共享内存管理、消息\由、分布式服务动态(重)(j)配置、ƈ发执行和同步Q等{?/font>
StreamModule
参考网站:(x)http://www.omnifarious.org/StrMod/
设计用于化编写分布式E序的库。尝试着使得~写处理异步行ؓ(f)的程序更Ҏ(gu)Q而不是用同步的外?/font>
包v异步的本质?/font>
SimpleSocket
参考网站:(x)http://home.hetnet.nl/~lcbokkers/simsock.htm
q个cd让编写基于socket的客?服务器程序更加容易?/font>
A Stream Socket API for C++
参考网站:(x) http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.html
又一个对Socket的封装库?/font>
XML
Xerces
参考网站:(x)http://xml.apache.org/xerces-c/
Xerces-C++ 是一个非常健壮的XML解析器,它提供了(jin)验证Q以?qing)SAX和DOM API。XML验证在文档类型定
?Document Type DefinitionQDTD)斚w有很好的支持Qƈ且在2001q?2月增加了(jin)支持W3C XML
Schema 的基本完整的开放标准?/font>
XMLBooster
参考网站:(x)http://www.xmlbooster.com/
q个库通过产生特制的parser的办法极大的提高?jin)XML解析的速度Qƈ且能够生相应的GUIE序来修?/font>
q个parser。在DOM和SAX两大LXML解析办法之外提供?jin)另外一个可行的解决Ҏ(gu)?/font>
Pull Parser
参考网站:(x) http://www.extreme.indiana.edu/xgws/xsoap/
q个库采用pullҎ(gu)的parser。在每个SAX的parser底层都有一个pull的parserQ这个xpp?/font>
q层暴露出来直接l大家用。在要充分考虑速度的时候值得试?/font>
Xalan
参考网站:(x) http://xml.apache.org/xalan-c/
Xalan是一个用于把XML文档转换为HTMLQ纯文本或者其他XMLcd文档的XSLT处理器?/font>
CMarkup
参考网站:(x) http://www.firstobject.com/xml.htm
q是一U用EDOM的XML解析器。在很多思\上面非常灉|实用。值得大家在DOM和SAX之外?/font>
求一点灵感?/font>
libxml++
参考网站 ?http://libxmlplusplus.sourceforge.net/
libxml++是对著名的libxml XML解析器的C++装版本
U学计算
Blitz++
参考网站:(x) http://www.oonumerics.org/blitz/
Blitz++ 是一个高效率的数D函数库Q它的设计目的是希望建立一套既具像C++ 一h便,同时?/font>
比Fortran速度更快的数D环境。通常Q用C++所写出的数值程序,?Fortran?0%左右Q因?/font>
Blitz++正是要改掉这个缺炏V方法是利用C++的template技术,E序执行甚至可以比Fortran更快?/font>
Blitz++目前仍在发展中,对于常见的SVDQFFTsQQMRES{常见的U性代数方法ƈ不提供,不过使用?/font>
可以很容易地利用Blitz++所提供的函数来构徏?/font>
POOMA
参考网站:(x) http://www.codesourcery.com/pooma/pooma
POOMA是一个免费的高性能的C++库,用于处理q行式科学计。POOMA的面向对象设计方便了(jin)快速的E?/font>
序开发,对ƈ行机器进行了(jin)优化以达到最高的效率Q方便在工业和研I环境中使用?/font>
MTL
参考网站:(x)http://www.osl.iu.edu/research/mtl/
Matrix Template Library(MTL)是一个高性能的泛型组件库Q提供了(jin)各种格式矩阵的大量线性代数方?/font>
的功能。在某些应用使用高性能~译器的情况下,比如Intel的编译器Q从产生的汇~代码可以看出其
与手写几乎没有两L(fng)效能?/font>
CGAL
参考网站:(x)www.cgal.org
Computational Geometry Algorithms Library的目的是把在计算几何斚w的大部分重要的解x案和
Ҏ(gu)以C++库的形式提供l工业和学术界的用户?/font>
游戏开?/strong>
Audio/Video 3D C++ Programming Library
参考网站:(x) http://www.galacticasoftware.com/products/av/
AV3D是一个跨q_Q高性能的C++库。主要的Ҏ(gu)是提供3D囑ŞQ声效支持(SB,以及(qing)S3MQ,控制接口
Q键盘,鼠标和遥感)(j)QXMS?/font>
KlayGE
参考网站:(x) http://home.g365.net/enginedev/
国内游戏开发高手自qC++开发的游戏引擎。KlayGE是一个开放源代码、跨q_的游戏引擎,q?/font>
Python作脚本语a。KlayGE在LGPL协议下发行。感谢龚敏敏先生Z国游戏开发事业所做出的A(ch)献?/font>
OGRE
参考网站:(x) http://www.ogre3d.org
OGREQ面向对象的囑Ş渲染引擎Q是用C++开发的Q用灵zȝ面向对象3D引擎。它的目的是让开发?/font>
能更方便和直接地开发基?Dg讑֤的应用程序或游戏。引擎中的类库对更底层的pȝ库(如:(x)
Direct3D和OpenGLQ的全部使用l节q行?jin)抽象,q提供了(jin)Z现实世界对象的接口和其它cR?/font>
U程
C++ Threads
参考网站:(x) http://threads.sourceforge.net/
q个库的目标是给E序员提供易于用的c,q些c被l承以提供在Linux环境中很隄到的大量的线
E方面的功能?/font>
ZThreads
参考网站:(x) http://zthread.sourceforge.net/
一个先q的面向对象Q跨q_的C++U程和同步库?/font>
序列?/strong>
s11n
参考网站:(x) http://s11n.net/
一个基于STL的C++库,用于序列化PODQSTL容器以及(qing)用户定义的类型?/font>
Simple XML Persistence Library
参考网站:(x) http://sxp.sourceforge.net/
q是一个把对象序列化ؓ(f)XML的轻量的C++库?/font>
字符?/strong>
C++ Str Library
参考网站:(x) http://www.utilitycode.com/str/
操作字符串和字符的库Q支持Windows和支持gcc的多U^台。提供高度优化的代码Qƈ且支持多U程?/font>
境和UnicodeQ同时还有正则表辑ּ的支持?/font>
Common Text Transformation Library
参考网站:(x) http://cttl.sourceforge.net/
q是一个解析和修改STL字符串的库。CTTL substringcd以用来比较,插入Q替换以?qing)用EBNF的语?/font>
q行解析?/font>
GRETA
参考网站:(x) http://research.microsoft.com/projects/greta/
q是由微软研I的研Ih员开发的处理正则表达式的库。在型匚w的情况下有非怼U的表现?/font>
l合
P::Classes
参考网站:(x) http://pclasses.com/
一个高度可UL的C++应用E序框架。当前关注类型和U程安全的signal/slot机制Qi/opȝ包括Z
插g的网l协议透明的i/o架构Q基于插件的应用E序消息日志框架Q访问sql数据库的cȝ{?/font>
ACDK - Artefaktur Component Development Kit
void outdata(A &s)
{
cout<<"out data:"<<s.name<<endl;
}
void main()
{
string t="tim";
A s1(t);
outdata(s1);
}