Visual Studio 2005中C++的变化
下一代visual studio版本(以前whidbey,现在是visual studio 2005)提供更加丰富的改进的库文件和没有很多幕后精简和加速的压力,它的大量配合的工具和新的功能将使开发者的开发过程变得简单有趣,对我而言,这些与visual studio 2005对C++的处理相比就显得有些苍白,这里我主要谈谈在下一代visual studio中C++的变化.
跟下划线拜拜
在visual studio.NET中引入了对C++扩展名的处理,扩展名是以两个下划线开始的关键字,比如__gc和__property.自从上个版本发布以来,我已经写了大量的双下划线特征的代码,我坦白也不喜欢这样,我了解具体的原因是:带两个下划线的关键字作为特殊的扩展名使它们不会跟标准编译器相混淆,你可以全面的管理扩展名可以用其他的编译器来编译,它忽视__关键字。
这是一种解决方法:微软发现了一种方法不改变编程语言的改变,但是会出现下面一些结果:
·开发者发现语法不自然
·不能被完全的采用
如例,适当的C++处理方法:
public __gc class Foo
{
// hundreds of lines of code
__property String* get_Text();
// hundreds of lines of code
__property void set_Text(String*);
// hundreds of lines of code
};
有良好习惯的程序员把get和put放在每个扩展名的右面,把潜在的变量放在旁边,但是编程语言没要求你这样做。它提供无环境支持定界结构让你明白作为一个单元是正确的,所以它是不自然的跟其它visual studio .NET语言不一样。但是你如何去处理这个问题那,唯一的方式完成C++转换成CLR反之就要改变C++.假如你想那样做,你可以有足够的自由得到自然一流的语言会给你最好的,你可以取消大量的带双划线的关键字。
生存时间和范围
我喜欢确定的解析,实际上我也喜欢碎片收集,我还能举出更多的,它们有自己的作用而且我也需要它们,假如我只在内存中构造一个对象,我希望在我自己清除它前不被清除,
所以内存管理是很复杂的。但是,如果你的对象包含一个非管理的源文件如数据库链接,一个开放文件,或者类似我要取得一个控制。我想知道它要尽快的离开,用这种模式去处理,但是它不是直接的,简单的亲密支持是最好的办法。
下面是在原始的C++中,你去完成这些事情:
//this is a code fragment { try { Foo* f=new Foo(/* params */); //all kinds of code, some of which might throw exceptions delete f; } catch (/* something */) |
如果你在堆栈建立对象,生命期是简单的
//this is a code fragment { Foo f; //all kinds of code, some of which might throw exceptions } |
当f超过范围,不论是否是意外它将被清除这是自然的。
当对象在管理堆里时,你不能把它删除,它将被碎片收集清除,如果你想清除管理着源文件的对象,你可以调用dispose()函数,虽然C#为它提供了的有效的结构,但是它仍然不象堆栈那样简单。
在新一代的语言(以前是C++/CLI),你在哪里建立对象不依赖于你建立对象的种类,你可以堆栈中管理对象,它有确定的解析,但它越界时将被清除,如果你愿意你可以在管理堆里建立对象。
这种变化带来其它的结果,其中最深远的是你可以把不同的对象放在摸板中或者可以把它看成其它类的成员变量,你可以得到完整的C++生存时间周期,而不是仅仅是把它分配到相应的堆,然后等碎片收集来处理它。
解析和定稿
当你为其它语言写了碎片收集对象是,你是否为它写了解析函数?当你使用C++,你可以在堆栈构造对象,解析函数将运行当它越界时,什么事情会发生当其他C#或VB程序调用这个对象,运行时仅从简单的方式去处理,它是用dispose()来解析,任何一个C++/CLI对象都有一个可以任意调用的解析函数。
假如你在C#或VB中有dispose()的类,你可能已经写了一个定论,C++/CLI也有简便的语法为定论,就象Foo的解析是~Foo,Foo的定论是!Foo(~是比特的not,!是逻辑的not,它们都是提醒是和构造函数对立的),
Finalizer将运行当在管理堆中建立而不被调用,确信它所包含的非管理源文件被清除,即使其他调用函数忘了去解析。
指针和句柄
在C++扩展名管理中,C++的主要限制没有变化,同样的符号和语法用做完全的事情,*的含义依赖于你的代码中的其他位置的信息,你可以试试下面的代码:
Foo* pf = new Foo(); |
Foo对象将在哪里建立?那块内存是否被清除?我能象下面那样对指针做算法吗:
pf++;
答案依赖于Foo是否用__gc关键字声明,假如它是碎片收集对象,它只能在管理堆不是在本堆和堆栈中建立,另一方面,如果没有用__gc声明,将在本堆中分配内存给它,你必须记得去清除它。
如果编译器有自由去改变语言,就象在C++/CLI上发生的,可以忽视什么地方生存的什么类型的类,可以用不同的语法表明它在哪里生存:
Foo^ hf = gcnew Foo(); |
这被叫做句柄,许多C++团队好象都是用^符号来标明的,你可以用*和->来解除句柄的引用,你可以从实例的声明而不是回过头从类的声明中得到生命期的声明。例如:
ref class R { private: int m_a; public: R(int a): m_a(a) {} }; |
你可能会认为ref是C++/CLI新的关键字,但它不是,“ref class“是关键字,你可以有变量是ref而不会引起混乱,其他的关键字还有”value class“,”interface class“,”enum class“,几乎过去所有的C++程序都会有value这个变量,我很高兴value没有变成关键字。
Ref class 是一个管理类,一个被设计成生存管理队中和被碎片收集管理的类,象我前面所示的你可以在堆栈中声明一个实例,编译器会帮你找到它,加上不可见的智能指针。
特性
有很多C++特性的改变,因为我是用C++比较笨拙的特性开始的例子,所以我现在关闭比较相近的C++
ref class R { private: int m_Size; public: property int Size { int get() { return m_Size; } void set(int val){m_Size = val;} } }; R r; r.Size = 42; |
property是一个关键字吗?有点象,它是一个位置关键字,所以你可以有property的变量和函数,而不会引起混乱,它只会在类定义中有特殊的含义,现在在C++/CLI中有单独的单元提供特性定义,我很喜欢这样,相信你也是。
转载于:https://www.cnblogs.com/flying_bat/archive/2004/11/02/59653.html
Visual Studio 2005中C++的变化相关推荐
- Visual Studio 2005中编译调试新功能
在日常的编程中,程序员经常离不开的工作之一,就是调试.当写好一段代码或程序后,在运行后总会出现这样那样的问题,比如各样的错误,程序员就必须进行调试,将这些错误排除.在最新出炉的Visual Studi ...
- Microsoft Visual Studio 2005中使用水晶报表
Microsoft Visual Studio 2005中使用水晶报表 沈阳 王智 OICQ:16994162 http://wangzhihome.51.net/ 2006-4-11 如有转贴请注明 ...
- Visual Studio 2005 中的新增安全性功能
Visual Studio 2005 中的新增安全性功能 Visual Studio 2005 中的新增安全性功能 发布日期: 11/18/2005 | 更新日期: 11/18/2005 Brian ...
- 在visual studio 2005中配置iup环境
在Visual Studio 2005中配置iup环境 原本是想在Linux环境中配置iup的,折腾了两天都没有成功.想着先在windows中试一下.所以这里把配置的过程写一下. 1.下载iup的wi ...
- Visual Studio 2005 中的 命令窗口
"命令"窗口用于直接在 Visual Studio 集成开发环境 (IDE) 中执行命令或别名.可以执行菜单命令和不在任何菜单上显示的命令. 1 调用命令窗口: 若要显示" ...
- 在Visual Studio 2005中安装Qt 4.3.2
1.正常安装Visual Studio 2005,只要安装了C++即可.注意:不是Express版本. 2.下载Qt源代码 Qt 4.3.2 Windows OpenSource版下载: http:/ ...
- 在Visual Studio 2005中调试SQL Server 2005的存储过程
介绍 SQL Server 2000可以让我们在查询分析器中直接调试存储过程( 更多的信息请参看:用SQL Server 2000的查询分析器调试存储过程) 到了现在的SQL Server 2005, ...
- Visual Studio 2005中web.sitemap 中扩展自定义属性的一些应用范例
Web.SiteMap 是 VS2005中一个非常重要的特性. 可以用于菜单等应用,但企业的应用中经常需要控制到 菜单的 target ,菜单的权限等. 通过扩展一些自定义属性可以实现(此方法已经在E ...
- visual studio 2005中生成网站和发布网站区别
生成网站就是编译网站存到你的工作路径中, 发布网站是将编译完成的网站存到别的地方,或者上传到服务器上,发布网站是不会带有源代码的,就是将你的网站需要使用的文件,和编译好的DLL另存为. 在网上查了一下 ...
最新文章
- iOS progressive Web App (PWA) 技术
- cad等比例缩放快捷键_「CAD」利用块对图形进行非等比例缩放
- [置顶] 自己动手实现OpenGL-OpenGL原来如此简单(三)
- Boost:是否支持sse2指令的测试程序
- HDFS(二)HDFS架构
- Pandas在数据分析中的应用
- 集合框架(Map容器/Collections工具类)
- 使用Entity Framework和Web API的ASP.NET Core Blazor CRUD
- Python动态页面抓取超级指南
- 抢滩新零售混战 实力战将才不惧双十一 附:双十一红包雨时间表
- html设置背景颜色宽度,如何设置div的背景色和高度 CSS示例代码
- 树莓派sd卡linux分区,树莓派安装了Kali系统的SD卡扩容问题(分区太小)解决办法...
- Python 替换同义词(jieba 实现)
- 什么是做空? 什么是做空和做多离岸人民币?
- 临床预测模型之综合判别改善指数IDI计算
- 输出指定位数的最小斐波纳契数
- mysql桌面型数据库下载_桌面数据库下载v2019.12.001 安装版-西西软件下载
- 莫队和带修莫队 学习笔记
- ArrayDeque(双端队列的线性实现)详解
- 打好“三场仗”,数据库新晋厂商石原子胜券在握
热门文章
- 【基础知识】 之 Binary Search Tree 二叉搜索树
- 使用SQL SERVER 2000的全文检索功能
- Linux Shell常用命令总结
- Linux下重要目录功能介绍
- Android 沉浸式透明状态栏与导航栏
- Position(Static, Absolute, Relative, Fixed)
- HTML表单提交规则
- 解决Webview加载不完全导致部分js无效
- CodeForces#520 div2 1062A - A Prank
- COGS 930. [河南省队2012] 找第k小的数 主席树