Visual Studio 2005中C++的改变[VC/C++编程]
本文“Visual Studio 2005中C++的改变[VC/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中有单独的单元供应特点定义,我很喜好这样,相信你也是.
以上是“Visual Studio 2005中C++的改变[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |