频 道 直 达 - 新闻 - 读书 - 培训 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 技术圈 - 博客 - BBS
51CTO.COM_中国领先的IT技术网站
找资料:

Visual C++ 2008新特性:MFC的增强

作者: 苏鹏 出处:IT168 2008-05-19 15:13    砖    好    评论   进入论坛
阅读提示:虽然在托管语言的发展方面C++似乎较之其他语言发展步调缓慢,但是C++语言的新功能依然不逊于任何其他托管语言。与Visual Basic这种日新月异的语言不同,C++语言一直保持其不变的风格是它的一个优良传统,当然C++的也并非永远一成不变,其每一步变化无不是经过反复推敲的经典之作。目前正在制定中的下一代 C++ 标准 C++ 0x 将通过对语言本身的扩展来满足最近十年来开发人员对它提出的各式各样的需求。

虽然在托管语言的发展方面C++似乎较之其他语言发展步调缓慢,但是C++语言的新功能依然不逊于任何其他托管语言。与Visual Basic这种日新月异的语言不同,C++语言一直保持其不变的风格是它的一个优良传统,当然C++的也并非永远一成不变,其每一步变化无不是经过反复推敲的经典之作。目前正在制定中的下一代 C++ 标准 C++ 0x 将通过对语言本身的扩展来满足最近十年来开发人员对它提出的各式各样的需求。技术报告1(TR1)是这一标准建立过程中的过度产品,更多的语法特性将作为最终版本的一部分进行发布。

标准模板库 数组

现有的C++标准模板库中有个备受争议的设计,就是其没有引入定长数组,当然有很多办法解决这一问题,比如使用C语言风格的数组,或者使用vector甚至使用第三方类库,但是这些方法显然没有解决这一问题。所以为C++新标准添加定长数组简直是天经地义的,使用新数组集合的方法也非常简单,数组长度被作为模板的一个参数,而数组的操作方式和STL中的vector对象完全一致。

#include
#include
#include
std::tr1::array intArray = {4, 8, 10};
std::tr1::array intArray2 = {4, 8};
intArray2[2] = 10;
std::cout << ((intArray == intArray2)?
std::string("Arrays are equal"):
std::string("Arrays aren't equal")
);
std::cout << std::endl;
for (std::tr1::array::const_iterator it =
intArray2.begin();
it != intArray2.end();
++it) {
std::cout << " " << *it;
}

对于上面的代码有些内容需要引起注意:

1. 在数组声明的过程中既可以定义全部内容也可以只定义一部分内容,编译器会判断数据类型和数组长度,并自动完成数组定义
2. “==”操作符被重载过了,重载之后的操作符可以用于比较两个数组中的元素是否相同。
3. 迭代器的工作方式和之前的标准模板库中集合对象的使用保持一致
Visual C++ 2008通过使用std::tr1名字空间引入了上面这些TR1的扩展功能。

正则表达式

虽然很多第三方工具已经在C++中实现了正则表达式功能,但是这些工具对于标准C++的整合远远没有达到大家所期望的程度。把正则表达式引入C++之后,正则表达式的运算结果就可以直接被STL中的其他运算所引用,并且使用正则表达式的代码也可以被各种编译器编译。

在TR1中引入的正则表达式类库basic_regex有点类似于标准C++中很重要的类库basic_string,对于一个basic_regex类,你需要指定的是使用char或者wchar字符作为参数。

basic_regex类的字符内容是正则表达式字符和符号,basic_regex类支持许多种正则表达式标准,如basic, extended, ECMAScript, awk, grep, 和 egrep。在设置好正则表达式字符串之后,basic_regex类的对象通过一系列函数接收一个用于拆分的字符串并进行正则匹配。

用于正则匹配的函数有3个,regex_match, regex_search 和 regex_replace.其中regex_match函数用于判断接受的字符串是完全否匹配正则表达式,regex_search用于返回参数中符合正则表达式的字符串内容,返回对象是一个match_results。而regex_replace用于替换提交字符串中正则表达式匹配的内容。

示例代码显示了如何使用正则表达式匹配一个电子邮件地址,并把匹配结果显示出来 .

#include
#include
#include
basic_regex regex("[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}",
basic_regex::icase);
cout<< std::boolalpha << regex_match("GoOD@DOMAIN.COM", regex)
<< std::endl;
cout<< std::boolalpha << regex_match("@DOMAIN.COM", regex)
<< std::endl;


函数对象

对于使用过C++/CLI委托的开发者来说,函数对象并不是特别新的的东西,就像在C++/CLI中提供的类型安全的函数指针一样,委托不但提供函数调用服务还可以为这个服务提供参数用于函数执行。这一定义减小了使用函数指针所带来的风险,下面的代码演示了使用函数对象进行方法调用。

bool PrintData(int i, double d){
cout << i;
cout << endl;
cout << scientific << d;
cout << endl;
return true;
}
{
function myPrint(PrintData);
bool res = myPrint(1, 2.0);
}


使用函数对象明显的好处就是减小了系统开销,myPrint在调用PrintData函数时候可以避免使用饱受争议且具有安全隐患的函数指针。

其他附加内容

TR1还更新了若干关于随机数发生器的标准类库,这其中包括一些随机数发生器如bernoulli_distribution, binomial_distribution, exponential_distribution, gamma_distribution, geometric_distribution, normal_distribution, and poisson_distribution等。分布类可以用于随机数的生成linear_congruential 和 mersenne_twister,下面的代码显示了使用mersenne_twister 运算法则和 gamma_distribution生成随机数

using namespace std::tr1;
...
//use TR1 typedef mt19937 for Mersenne twister algorithm
mt19937 randomAlg;
gamma_distribution randomDist;
double d = randomDist(randomAlg);


在TR1中还有几个专门用于连接集合对象的新对象unordered_set, unordered_map, 和unordered_multimap,形如其名,这些集合对象不同于之前的STL中的set和map集合对象,它们不对数据排序,所以对它们的一般性操作,包括删除,插入和定位操作的时间负责度都是o(1),当然,缺点也十分明显,不进行排序的集合对象很难进行管理。

总结

TR1的这次更新使C++向着C++0x标准更近了一步,这一变化所呈现的C++标准变化将是革命性的,它为一如既往的强大C++语言诸如了新的特性,这使得这一语言在可预见的未来将变得更加流行。TR1既为使用托管代码开发的C++开发者提供了其早就期望的好处,也为那些依旧使用C++的软件产业提供了新的优势。

TR1在Visual C++ 2008中的发布是微软继续支持C++的有力证据,同时也显示了本地代码开发者依然有很好的前景。(这里针对使用托管代码开发者而言)

【相关文章】

【责任编辑:碧海蓝天 TEL:(010)68476606】

关于 TR1  Visual Basic  C++  MFC
专题
C++是垃圾语言?!
VC++基础开发专题
C++开发专栏
初探敏捷开发
WCF开发基础
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 领 先 的 IT 技 术 网 站 ·
技 术 成 就 梦 想
·Java基础教程 (查看77786次)
·UML类图详解 (查看68372次)
·C++是垃圾语言?! (查看38173次)
·C#技术开发指南 (查看37311次)
·UML统一建模语言 (查看37181次)
·Java编程开发手册 (1196个砖)
·Java基础教程 (430个砖)
·C#技术开发指南 (311个砖)
·.NET开发手册 (246个砖)
·PB开发教程 (223个砖)
·Java编程开发手册 (657个好)
·Java基础教程 (578个好)
·.NET开发手册 (278个好)
·PB开发教程 (212个好)
·Delphi开发技术手册 (197个好)
订阅技术快讯
电子杂志下载
名称:SQL Server数据库管理精品黄皮书
简介:书中文章经过精挑细选,便于用户能根据自己的实际工作和学习,快速在本书寻找到相关资料。内容涵盖了SQL Server的安装与升级、语句查询、数据备份和恢复、自动化任务、数据同步、数据字典、安全和预防、性能和优化、集群等各方面应用信息,以及DBA管理人员在数据库管理工作中
名称:2007路由技术大全
简介:《2007路由技术大全》由51CTO.com网站特别策划制作,该书包括路由器技术、路由器产品、路由器配置、安全设置、路由器故障处理、路由器密码恢复,以及广大网友在实践使用中的心得经验和技巧文章,内容注重实用性,适用于初学者入门,也适合多年从业者提高,是一本实践和理论完
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
微软出价446亿美元收购雅虎
微软出价446亿美..
解析35岁技术人的价值与出路
解析35岁技术人的..
首届IT工程师调查十大发现
首届IT工程师调查..
· 首届IT工程师调查十大..
· 网管员如何踏上高薪之路
· 汶川大地震 IT技术人在..
· Vista SP1对决XP SP3
· 主流品牌防火墙配置
· 勇闯IT培训黑色围城
· LAMP技术精解
· 访问控制列表(ACL)介绍
· Ubuntu 中文开源频道
· 专题:AIX操作系统管理..
· 2008年上半年全国软考..
· 运营商封堵非法ADSL共享
· IPv6协议--拓展网络无..
· 二手仿冒设备与思科再..
· 网络故障排除宝典
· 华为路由器配置
ARP攻击防范与解决方案
ARP攻击防范与解..
iSCSI应用与发展
iSCSI应用与发展
SQL Server 2008/2005全解
SQL Server 2008/..
· SQL Server 2008/2005..
· SOA 面向服务架构
· SQL Server 2008/2005..
· iSCSI应用与发展
· RAID——磁盘阵列基础
· Apache技术专题
· 三层交换技术专题
· SQL Server入门到精通
· Apache技术专题
· 国际文档格式标准开战
· 路由器设置与口令恢复
· 打造安全服务器
· PHP开发应用手册
· SOA 面向服务架构
· 企业数据恢复指南
· ADSL应用面面俱到
ARP攻击防范与解决方案
ARP攻击防范与解..
SQL Server 2008/2005全解
SQL Server 2008/..
iSCSI应用与发展
iSCSI应用与发展
· iSCSI应用与发展
· SQL Server入门到精通
· SQL Server 2008/2005..
· SOA 面向服务架构
· Apache技术专题
· iSCSI应用与发展
· 三层交换技术专题
· Apache技术专题
· 企业数据恢复指南
· RAID——磁盘阵列基础
· 路由器设置与口令恢复
· SOA 面向服务架构
· ADSL应用面面俱到
· ADSL应用面面俱到
· 反垃圾邮件技术应用
· 访问控制列表(ACL)介绍