虽然学过一小部分c++但是还没到能熟练的地步,所以有些不方便的地方得改进自己可能不是很清楚也理解的不是很明白,一下管点可能有些偏颇,但是确实是不太懂的地方。
我读的博客
http://msdn.microsoft.com/en-us/library/hh279654.aspx;
http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx
http://msdn.microsoft.com/en-us/library/vstudio/hh567368.aspx;
http://herbsutter.com/elements-of-modern-c-style/
部分的http://en.wikipedia.org/wiki/C%2B%2B11
部分的http://www.cnblogs.com/zhuyp1015/category/370450.html
问题一:
在http://msdn.microsoft.com/en-us/library/hh279654.aspx;中我从下面的代码了解到的新特性就是以auto代替new以减少频繁的释放堆空间带来的不可预估的麻烦,但是我的问题是在有些时候当函数自己提供参数的构造方法时,你只需要传进去一个空指针,但是如果使用了auto这样的特性,函数是不可能自己提供构造方法了,因为在函数结束时auto会自动释放之前申请的空间,这样的话c++得好多库函数都需要进行大量的改动,请问面对这种情况新版c++得选择是继续提供malloc,alloc等原始函数呢还是想什么别的办法?
自己找到答案了,可以用move
circle* p = new circle( 42 ); vector<shape*> v = load_shapes(); for( vector<circle*>::iterator i = v.begin(); i != v.end(); ++i ) { if( *i && **i == *p ) cout << **i << “ is a match ”; } for( vector<circle*>::iterator i = v.begin(); i != v.end(); ++i ) { delete *i; // not exception safe } delete p;
问题二
在http://msdn.microsoft.com/en-us/library/vstudio/hh567368.aspx;中的enum中我有一个问题,文中所说的enum如下代码说明可以重定义
这样做有两个有点,避免了必须要知道所有的enumrator变量类型才能最终确定值得麻烦,还能防止因enum默认值为数值所造成相互比较的麻烦,因为enum可以在enum class H里面定义成类变量,而其类型也可以定义为short,int等类型,放便比较,但是我的问题是袁磊的enum是列出几个值然后有enum自动赋值成0,1,2递增,但是如果我新赋一个类型,则这种有一个隐含的数值的属性就消失了,因为如果我赋成string显然不能递增了,那我想问为什么原来的enum需要这些0,1,2而现在的enum就不需要了呢?
问题三:
像新的auto可以省略类型名的重复声明也可以与lambda这样的表达式一起并用,我的问题是auto的复杂机制如何实现的?如果在声明一个变量时自动判断出其类型?每个类型的长度都不一样,auto如何识别之后再分配的呢?
问题四:
像auto这样虽然使用时非常方便,但是个人觉得这无疑增加的代码的维护成本,因为你阅读代码的时候看到auto还要去寻找其意思,请问这个方面是如何考虑的?
之前没有使用过lambda函数,这次在c++11里面看到觉得就像是编译课上讲的“过程”一样,但是这样的代码说实话,如果让我看的话我会疯狂尤其如果发生嵌套的话简直生不如死,所以如何平衡代码的维护,还是这个问题?
问题五:
在http://herbsutter.com/elements-of-modern-c-style/中没有理解所谓的右值引用的内部处理状态和技术实现,大概只是知道了如何处理函数内部初始化外部变量的笼统概念。而http://en.wikipedia.org/wiki/C%2B%2B11中对move的解释也不太懂,例子中没有涉及到move的使用,目前的理解就是move与右值引用一起使用,但是具体move如何用的没太看懂。因为自己使用的是vs2008所以这个版本的c++确实没用过。提出的问题可能有点幼稚。
新特性:除了在问题中提到的新特性外还有
新增了nullptr来专门代替null或0针对指针进行处理;
新增了begin(),end()函数代替x.begin(),x.end()来处理各种各样的变量;
多样的初始化提供了多样的选择,如下图;
//C++98 rectangle w( origin(), extents() ); // oops, declares a function, if origin and extents are types complex<double> c( 2.71828, 3.14159 ); int a[] = { 1, 2, 3, 4 }; vector<int> v; for( int i = 1; i <= 4; ++i ) v.push_back(i); // C++11 rectangle w { origin(), extents() }; complex<double> c { 2.71828, 3.14159 }; int a[] { 1, 2, 3, 4 }; vector<int> v { 1, 2, 3, 4 };
move的使用方便了callee-allocated out
现象,即函数内部初始化外部变量现象。
tuple容器可以容纳不同类型的定长的新属性,个人认为更加类似于小的方便的结构体。
smart_pointers一个新的功能是统计指向对象的指针的个数并在没有指针指向对象的时候自动释放对象。这个是我发现的最给力的新增功能。首先便于纠错,可以随时看到操作对象的指针个数,方便就错;自动释放改变了复杂的检查释放机制,使代码能更佳易读和使用;