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 */)
{
delete f;
//whatever else, or rethrow;
}
}

如果你在堆栈建立对象,生命期是简单的

程序代码:

//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中有单独的单元提供特性定义,我很喜欢这样,相信你也是。

时间: 2024-08-01 14:15:42

Visual Studio 2005中C++的变化的相关文章

Visual C++ 2005中的突破性变化

Microsoft Visual C++ 2005是微软公司Visual Studio 2005开发套件中的一出重头戏,与前一个版本相比,其革新性的集成开发环境与C++编译器,带来了有许多改变.在本文中,主要讲解程序员在升级程序时,可能会遇到的一些不同之处及变化,而这些变化很可能会使老一点的程序不能通过编译.总之,这些变化绝不是偶然发生的,其背后都有强大的理论依据在支撑,所以,使用Visual C++的程序员,在升级之前,一定要弄清楚这些变化. Visual C++中已经发生的变化 微软Visu

如何在Microsoft Visual Studio 2005中创建控制台应用程序

在 Visual Studio 2005 中创建控制台应用程序 在 Visual Studio 2005 中的"文件" 菜单上,指向"新建" 并单击"项目". 在"新建项目" 对话框中,选择一种语言,然后在"项目类型" 框中选择"Windows". 在"模板" 框中,选择"控制台应用程序" . 在"位置" 框中,键入指向应用程序

asp.net夜话之四:Visual Studio 2005中容易被忽略的技巧

在今天我主要要介绍的有如下知识点: Visual Studio 2005网站开发环境 任务管理器 配置外部工具 代码段管理器 发布网站 之所以要单独用一篇文章来介绍Visual Studio 2005这个集成开发环境,是因为在做企业培训的时候,发现很多程序员仅仅用了一些基本功能,这个好像也符合软件界一个"20%和80%法则",就是80%的用户只用到了软件的20%的功能.确实有时候利用基本功能就足以进行开发了,但是有些功能能够方便我们的开发,有些能提高我们的开发速度,所以我觉得这些计较值

体验Visual Studio 2005中C++语言

Viusal Studio2005极大地丰富了它的库,可以说是科研背后的清障机和加速器,对于这一点,我想大部分人都是这么认为的.它带来的大量工具及新增的功能性函数使开发人员的生活越来越快乐.简单.但对于我来说,所有这些与Visual Studio2005在C++上做的改变相比却都显得是那么苍白无力.这篇文章中,我着重叙述即将向用户发行的Viusal Studio2005版本给C++带来的变化. 一.对下划线说再见 Visual Studio.NET 2002在C++中引入了可扩展的托管,这种扩展

求Visual Studio 2005 中 Login 控件 的实现代码

问题描述 没做过.net,所有请教一下.页面很简单,就是一个login控件,用来实现登陆功能,最好带有解释.解决就给分,分不够可以在加. 解决方案 解决方案二:自己先顶一下.解决方案三:楼主的意思是提供ui么?<%@PageLanguage="C#"%><%@ImportNamespace="System.ComponentModel"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Trans

Visual Studio 2005 中的新特性

http://www.c-sharpcorner.com/UploadFile/mahesh/VS2005Editor11162005003633AM/VS2005Editor.aspx?ArticleID=8de67dd3-cc4e-4fb8-a76e-a002d4c0d16e

在Visual Studio 2005和ASP.NET 2.0中使用强类型数据存取

asp.net|visual|数据 "Never put off until run time what can be done at compile time."David Gries, Compiler Construction for Digital Computers Introduction 作为程序员,我们在学习一些新技术的时候,范例有时候会是我们最大的敌人.指南通常被设计成简单易懂,但同时里面的懒惰.无效率的甚至是危险的代码编写会增多.像这种情况最普遍存在的就是在ADO.

详解Visual Studio 2010中的扩展管理器

扩展能够为核心应用程序提供附加的功能或者自定义设置.在很多应用程序中这都是很流行的,包括流行的web浏览器IE和Firefox.微软的Office.媒体播放器.Photoshop.Eclipse.Visual Studio等等.其中有些可能比较新奇,而针对开发工具--像Eclipse和Visual Studio--的扩展让开发者的生产力得到了显著提高. Visual Studio早期的版本是构建在COM技术之上的.而Visual Studio的主要扩展方式插件是通过COM接口实现的.随着时间的变

Chrome Visual Studio 2005下的编译过程_C#教程

编译篇 研究Chrome ,首先得把它编译出来,这对于后续的代码分析和阅读有很大的帮助,想想自己编译出一个 Chrome 浏览器来使用,那是一件很炫的事情. 编译环境准备 Chrome的编译和 WebKit 相比起来,难度上来说,简直是一元二次方程求解和偏微分方程求解的对比(我到现在还没有完整的把 WebKit 编译出来,鄙视一下自己).虽然 Chrome 也是从 WebKit 演进过来,差不多也就是把 WebKit 的 JS 引擎替换成了 V8 .但是不得不承认 Google 把 WebKit