C++11类型转换运算符

转朋友博客http://gclxry.com/c-plus-plus-type-conversion/ 有这么几行代码: 这是默认的shared_ptr中保存的是一个空指针。第二个输出结果为00000000我可以理解,shared_ptr重载了<<操作符,最终调用的是shared_ptr里面的_Px.get()。 第一个输出结果为false我就不理解了。虽然默认的shared_ptr中保存的是空指针,但是shared_ptr对象本身不为空,为什么行为跟空指针一样呢,if判断shared_ptr对象竟然是false,这背后肯定做了什么。 代码跳转到shared_ptr代码的定义,没有发现什么。只好反汇编一下if(p)的代码。反汇编显示调用的是std::shared_ptr<int>::operator... Read More | Share it now!

C++11语言新特性少举

转朋友博客http://gclxry.com/c-plus-plus-11-new-features/ template表达式内的空格 在两个template表达式的闭符之间放一个空格的要求已经过时了,以下两种写法都正确。 nullptr和std::nullptr_t c++11鼓励使用nullptr来取代0或者NULL来表示空指针。这个特性可以避免把一个空指针解释成一个整形值,比如: nullptr是个新关键字。它被自动转换为各种pointer类型,但不会转换为整形值。它是std::nullptr_t类型。 auto类型 c++11允许你声明一个变量而不需要指明它的类型,只需要说它是auto类型。然后它的类型会根据其初值自动推导出来。这意味这auto类型变量就需要马上初始化。 auto变量自动推导类型,大大简化了我们的编程工作。 一致性初始化与初值列 c++有多种初始化变量的方法,比如大括号,赋值操作符,小括号。为此c++11引入一个一致性初始化的概念,任何类型都可以用大括号来初始化。 空的初始列会别初始化为0或者nullptr,比如: 用大括号初始化值不能窄化。 c++标准库提供了一个std::initializer_list来支持一系列值进行初始化。 for循环 c++... Read More | Share it now!

C++11中的Lambda表达式

转自朋友博客http://gclxry.com/c-plus-plus-lambda/ c++11引入了Lambda表达式,用于定义并创建匿名的函数对象,以简化编程工作。 最简单的Lambda表达式如这样: 也可以在定义的时候直接调用: 或者把它传递给一个变量,再调用,可以多次调用: 完整的lambda表示格式如下: 中括号里是指明要捕获的外部作用域的变量。 小括号是传递给lambda表达式的参数。 mutable修饰符,可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)。 exception声明用于指定函数抛出的异常,如抛出整数类型的异常,可以使用throw(int)。 ->返回值类型,标识函数返回值的类型,当返回值为void,或者函数体中只有一处return的地方(此时编译器可以自动推断出返回值类型)时,这部分可以省略。 大括号就是函数体了。 捕获参数 lambda表达式中括号是用来捕获外部作用域的变量的: [],不捕获任何外部作用域变量。 ,按值传递的方式捕获所有外部作用域的变量。 ,按引用传递的方式捕获所有外部作用域的变量。 ,个别的指明值的捕获方式。 ,y按引用传递,其他按值传递。 ,y按值传递,其他按引用传递。 mutable修饰符可以对值传递的变量进行修改,并保存状态: lambda的类型,是个匿名的函数对象。每个lambda表达式的类型都是独一无二的。但可用std::function<>模版接受一个一般化的lambda:     ... Read More | Share it now!

C++11新增类型tuple

转自朋友博客:http://gclxry.com/c-plus-plus-tuple/ c++11新增了tuple类型,它可以容纳不定数量的类型变量,像一个更加易用的简化版struct。 tuple不是寻常的容器,它不能用迭代器去遍历。get的值需要编译期就确定,因此也不能用index下标变量去遍历: 虽然不能用一般的方式的遍历tuple,但可以用不定参数的模板在编译期去递归获取每个参数。一下是个例子来打印tuple的值。 tuple里面的类型可以是引用类型。 使用tie,可以方便的从tuple中提取出值来: 还可以用std::ignore忽略提取某些值: 第一次看到tie的时候觉得很神奇,为么tie能够的提取tuple中的值呢?答案很简单,tie根据参数建立了一个临时的参数引用类型tuple,然后重载了=操作,再利用不定参数模板来遍历另一个tuple中的值。 ... Read More | Share it now!

C++11&C++14&C++17中的一些新特性

C++11包括大量的新特性:包括lambda表达式,类型推导关键字auto、decltype和模板的大量改进等。 一、auto C++11中引入auto第一种作用是为了自动类型推导。auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型。通过auto的自动类型推导,可以大大简化我们的编程工作。auto实际上实在编译时对变量进行了类型推导,所以不会对程序的运行效率造成不良影响。另外,似乎auto并不会影响编译速度,因为编译时本来也要右侧推导然后判断与左侧是否匹配。 auto不光有以上的应用,它在模板中也是大显身手,比如下例这个加工产品的例子中,如果不使用auto就必须声明Product这一模板参数: 如果使用auto,则可以这样写: 抛弃了麻烦的模板参数,整个代码变得更加正解了。 二、decltype decltype实际上有点像auto的反函数,auto可以让你声明一个变量,而decltype则可以从一个变量或表达式中得到类型,有实例如下: 有人会问,decltype的实用之处在哪里呢,我们接着上边的例子继续说下去,如果上文中的加工产品的例子中我们想把产品作为返回值该怎么办呢?我们可以这样写: 三、nullptr nullptr是为了解决原来C++中NULL的二义性问题而引进的一种新的类型,因为NULL实际上代表的是0。 四、序列for循环 在C++中for循环可以使用类似java的简化的for循环,可以用于遍历数组,容器,string以及由begin和end函数定义的序列(即有Iterator),示例代码如下: 五、Lambda表达式 lambda表达式类似Javascript中的闭包,它可以用于创建并定义匿名的函数对象,以简化编程工作。Lambda的语法如下: (操作符重载函数参数)->返回值类型{函数体} []内的参数指的是Lambda表达式可以取得的全局变量。(1)函数中的b就是指函数可以得到在Lambda表达式外的全局变量,如果在[]中传入=的话,即是可以取得所有的外部变量,如(2)和(3)Lambda表达式; ()内的参数是每次调用函数时传入的参数; ->后加上的是Lambda表达式返回值的类型,如(3)中返回了一个int类型的变量。 六、变长参数的模板 我们在C++中都用过pair,pair可以使用make_pair构造,构造一个包含两种不同类型的数据的容器。比如,如下代码: 由于在C++11中引入了变长参数模板,所以发明了新的数据类型:tuple,tuple是一个N元组,可以传入1个,... Read More | Share it now!