当前位置:天才代写 > tutorial > C语言/C++ 教程 > Visual Studio 2005中C++的变革

Visual Studio 2005中C++的变革

2017-11-07 08:00 星期二 所属: C语言/C++ 教程 浏览:464

下一代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) {}
}; 
#p#分页标题#e#

你大概会认为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中有单独的单位提供特性界说,我很喜欢这样,相信你也是。

 

    关键字:

天才代写-代写联系方式