小女巫 发表于 2015-1-16 11:05:02

带来一篇VS2013中的C++11新特征

初学阶段只要把上课时候学习过的命令练熟就可以了.单靠学习各种命令而成为高手是不可能的。
  VisualC++2013Preview在6月公布了,C++开辟者又找到一个编译器能够更好的撑持ISOC++11的特征了。本文先容了这些新的特征并附有代码实例。
  你想下手实验编译文中的这些代码话,必要往下载并安装VisualStudio2013Preview(话说:付费吗?),我还没有在其他编译器上测试这些代码,以是我其实不晓得与Gcc或Clang的兼容性(可爱的C++)。



  原始字符串字面值

  VC++2013如今撑持原始字符串字面值了。注重:它其实不撑持一致码字符串字面值。一个原始字符串字面值同意你制止本义那些在HTML,XML和正则表达式里使用得轻车熟路的特别字符。上面是一个示例用法:
autos1=R"(Thisisa"raw"string)";  如今,s1是一个指向常量字符串值为“Thisisa"raw"string”的指针。只管不撑持嵌套双引号,这与C#撑持的@string笔墨是相似的。那末要在一个字符串字面值中嵌进R"(...)"会如何。这类情形下,你可使用以下语法:
autos2=R"QQ(Example:R"(Thisismyrawstring)")QQ";  如今,s2包括Example:R"(Thisismyrawstring)"。在这个例子中,我把QQ作为界定符。这个界定符能够是任何长度不凌驾16的字符串。原始字符串字面值也能够包括换行:
autos3=R"(<tr><td>data</td></tr>)";  最初,不管他们甚么时分增加一致码字符串字面值的撑持,你都能够将它们毗连起来并组成原始一致码字符串字面值。
  可变参数模板

  可变参数模板是一个同意多个参数的模板。在我看来,这是个供应给库作者而不是给库利用者的特征,以是我也不是很断定它在C++程序员中会有多盛行。以下我们用一个十分复杂的例子来展现怎样在实践开辟中利用可变参数模板。
//Variadictemplatedeclarationtemplate<typename...Args>classTest;//Specialization1template<typenameT>classTest<T>{public:TData;};//Specialization2template<typenameT1,typenameT2>classTest<T1,T2>{public:T1Left;T2Right;};voidFoo(){Test<int>data;data.Data=24;Test<int,int>twovalues;twovalues.Left=12;twovalues.Right=15;}  当利用可变参数模板时,智能感到(intellisense)能很好地共同我们的开辟。可变参数模板的完成包含一个叫asizeof的函数,这个函数能前往这个模板的参数个数。
template<typename...Args>classTest{public:size_tGetTCount(){returnsizeof...(Args);}};//...Test<int>data;size_targs=data.GetTCount();//1Test<int,int,char*>data2;args=data2.GetTCount();//3Test<int,float>data3;args=data3.GetTCount();//2  这实在就是一个数个数的例子,但我猜他们之以是利用一个现存的函数名是由于如许子做会让C++程序员们更简单上手。
  关于可变参数模板,一个经常使用的做法就是专攻个中一个参数,然后把其他的参数都变成可选。这个做法能够以递回的情势完成。以下是一个对照傻的例子,但它能让你分明甚么时分不该该用可变参数模板,继而更好地懂得这个言语特征。
template<typename...Args>classTest;//Specializationfor0argumentstemplateclassTest{};//Specializationforatleast1argumenttemplate<typenameT1,typename...TRest>classTest<T1,TRest...>:publicTest<TRest...>{public:T1Data;//ThiswillreturnthebasetypeTest<TRest...>&Rest(){return*this;}};voidFoo(){Test<int>data;data.Data=24;Test<int,int>twovalues;twovalues.Data=10;//Rest()returnsTest<int>twovalues.Rest().Data=11;Test<int,int,char*>threevalues;threevalues.Data=1;//Rest()returnsTest<int,int>threevalues.Rest().Data=2;//Rest().Rest()returnsTest<char*>threevalues.Rest().Rest().Data="testdata";}  人人请注重了,万万别把代码写成如许。这个例子仅仅是用来教授教养的,准确的做法我会鄙人一个章节中告知人人。
  Tuple的完成

  我们来看一下stdtuple的头文件(由VC++团队的StephanT.Lavavej卖力保护-最后的代码由P.J.Plauger编写),扫瞄这些代码,让我的年夜脑几近要宕失落了。为了更好的了解代码,我将代码举行简化,摘出个中能够会见tuple的值的起码的代码(可以撑持读和写)。这有助于了解在计划模板类时,一般可变参数模板是怎样经由过程递回睁开来年夜幅削减代码的行数。
//tupletemplate<class..._Types>classtuple;//空tupletemplateclasstuple{};//递回的tuple界说template<class_This,class..._Rest>classtuple<_This,_Rest...>:privatetuple<_Rest...>{public:_This_Myfirst;};  这里的递回特化利用了承继,因而tuple的每一个范例成员都断定的时分递回会停止。读取tuple值的时分,tuple_element类起到读取帮助类的感化。
//tuple_elementtemplate<size_t_Index,class_Tuple>structtuple_element;//selectfirstelementtemplate<class_This,class..._Rest>structtuple_element<0,tuple<_This,_Rest...>>{typedef_This&type;typedeftuple<_This,_Rest...>_Ttype;};//recursivetuple_elementdefinitiontemplate<size_t_Index,class_This,class..._Rest>structtuple_element<_Index,tuple<_This,_Rest...>>:publictuple_element<_Index-1,tuple<_Rest...>>{};  这里又一次利用了递回承继,同时界限前提也特化了。注重这里的两个typedef,个中一个界说为对应值范例的援用,另外一个界说为和tuple_element范例参数不异的tuple范例。因而,给定一个_Index值,在谁人递回条理上我们就可以失掉对应tuple的范例和tuple值的范例。上面的get办法就利用了这个特征。
//getreferenceto_Indexelementoftupletemplate<size_t_Index,class..._Types>inlinetypenametuple_element<_Index,tuple<_Types...>>::typeget(tuple<_Types...>&_Tuple){typedeftypenametuple_element<_Index,tuple<_Types...>>::_Ttype_Ttype;return(((_Ttype&)_Tuple)._Myfirst);}  注重前往范例,它利用下面界说的范例typedef。一样,元组(tupleis)转换为上述界说过的范例_TType,然后我们会见_Myfirst成员(它暗示的值)。如今你能够以下所示,编写代码,
tuple<int,char>t1;get<0>(t1)=959;get<1>(t1)=A;autov1=get<0>(t1);autov2=get<1>(t1);  如今,这不必说,但我会说只是能够一定的是------这里只是为了演示。不要在实践代码中利用这些办法,而是挪用std::tuple,它能够完成比这统统多的功效(这就是为何他有800行长).
  代办署理机关函数

  代办署理机关函数已在C#顶用了好长工夫,以是将其引进到C++中也很不错。编译器同意一个范例的机关函数(代办署理机关函数)在其初始化列表中包括另外一个机关函数。之前编写代码情势以下:
autos2=R"QQ(Example:R"(Thisismyrawstring)")QQ";0  接纳代办署理机关函数是,能够写成以下情势:
autos2=R"QQ(Example:R"(Thisismyrawstring)")QQ";1  相干浏览-HerbSutter和JimHyslop在十年前(2003年5月)写的一篇风趣的关于代办署理机关函数的文章。


[*]DelegatingConstructors
  函数模板中的默许模板参数

  这是VC++2013如今撑持的另外一项C++11特征。今朝为止,上面的代码仍旧没法经由过程VC++编译。
autos2=R"QQ(Example:R"(Thisismyrawstring)")QQ";2  VisualC++2013可以顺遂编译这些代码,模板参数揣度也能准确举行。
autos2=R"QQ(Example:R"(Thisismyrawstring)")QQ";3  这项特征的有用性鄙人面的例子里尤其分明。
autos2=R"QQ(Example:R"(Thisismyrawstring)")QQ";4  并非一切的参数都必要默许参数。
autos2=R"QQ(Example:R"(Thisismyrawstring)")QQ";5  假如带默许参数的函数模板有重载的话,范例没法揣度的时分编译器将会给堕落误。
autos2=R"QQ(Example:R"(Thisismyrawstring)")QQ";6  利用函数模板的默许模板参数时应该在这里注重。
  显式转换运算符

  我仍旧记得2004年八月的一天,谁人时分我意想到只管我是一个还不错的C++程序员,我对explicit关头字一窍不通,这令我非常忐忑不安。那以后我写了一篇博客文章


[*]Applyingexplicitonyourconstructors(必要翻墙)
  复杂申明一下explicit的利用。思索一下上面的例子。
autos2=R"QQ(Example:R"(Thisismyrawstring)")QQ";7  只管转换机关函数能够到达这一目标,转换运算符由于缺少尺度撑持而没法完成相似的义务。坏动静是你没法确保转换机关函数和转换运算符的举动是分歧的。思索一下上面的例子。
autos2=R"QQ(Example:R"(Thisismyrawstring)")QQ";8  下面的代码能经由过程编译。如今有了C++11的新特征,explicit也能够用在转换运算符上了。
autos2=R"QQ(Example:R"(Thisismyrawstring)")QQ";9  上面的这个例子里隐式使用了bool范例的转换运算符。
autos3=R"(<tr><td>data</td></tr>)";0  这段代码能经由过程编译。如今试一下在运算符上加上explicit关头字
autos3=R"(<tr><td>data</td></tr>)";1  正如预期,第二个转换没法经由过程编译,可是第一个经由过程了。这是由于if里的bool转换被视为显式转换。因而在这里你要胆小如鼠,仅仅增加explicit关头字没法避免不测情形下的范例转换,范例大概仍旧是不平安的。
  初始化列表和一致初始化

  一向以来我们都能够用初始化列表初始化数组,如今关于有范例为std::initializer_list<T>(包括机关函数)的范例我们也能够这么做。尺度库中的容器如今都撑持这一特征。
autos3=R"(<tr><td>data</td></tr>)";2  本人完成这些功效很华侈工夫
autos3=R"(<tr><td>data</td></tr>)";3  用户自界说范例也能够利用这一特征
autos3=R"(<tr><td>data</td></tr>)";4  C++11也新增了一个相干特征:一致初始化(Uniforminitialization)。这一特征将主动婚配符合的机关函数
autos3=R"(<tr><td>data</td></tr>)";5  利用初始化列表的机关函数将被优先利用
autos3=R"(<tr><td>data</td></tr>)";6  就是这些内容。像平常一样,接待反应和品评倡议。感谢。
  参考材料



[*]C++11Features(ModernC++)
[*]What’sNewforVisualC++DevelopersinVS2013Preview
  英文http://www.codeproject.com/Articles/623872/Cplusplus-11-features-in-Visual-Cplusplus-2013-Pre
当你经过一段时间的学习后就应该扩充自己的知识,多学习linux命令,但是不要在初学阶段就系统的学习linux命令。

柔情似水 发表于 2015-1-18 07:47:52

在看别人程序时,不要连什么this指针呀,继承、派生、友员都搞不清楚,学了一个多月,小有点心得!总结如下:

山那边是海 发表于 2015-1-25 20:38:51

此外,在实训中,我还认识到自己的粗心。在编程时,粗心的把一语言写错,导致结果运行不了。在以后的学习中,我要特别注意小节,要认真对待。

精灵巫婆 发表于 2015-2-9 15:43:12

一时兴起,慷慨激扬。个人观点,高手路过,留下心得,大家互相学习。

因胸联盟 发表于 2015-3-9 03:53:33

其实这一部分,以后在写程序时会非常有用,自己对照书把TextQuery类实现一下。

爱飞 发表于 2015-3-16 21:44:22

比如..C++比较难学,但你可以学学JAVA, JAVA倒是好学好用, 而且还能帮助你掌握面向对象的思维. 当然也很适合做出东西.

老尸 发表于 2015-3-23 07:49:08

经过一周的实训,我受益匪浅,感触良多。
页: [1]
查看完整版本: 带来一篇VS2013中的C++11新特征