C++培训 C++11新特性:杂项
2016-10-10 13:32
309 查看
C++培训之前小编给大家总结了一些C++的新特性,这一篇文章是介绍的C++11新特性之杂项,在后面的文章中,小编还会给大家总结一些C++11新特性的知识出来! 类型别名声明 类似typedef,新标准中可以使用using为类型声明一个别名(alias)。 std::cout<<"test using alias:\n"; using HT = double; using NAME = std::string; HT h = 1.78; NAME name = "Robert"; std::cout< range for range for语句在之前的章节中已经见识过了: std::cout<<"test range for:\n"; std::string nation = "CHINA"; for(auto c : nation) std::cout< for(auto &rc : nation) rc = tolower(rc); std::cout<<"lower: "< std::cout<<"test range for done.\n"; 这里需要注意的是,在第二个例子中,range for语句中可以直接使用引用,从而修改被迭代遍历的对象本身。 另外,range for不能用于动态分配内存的数组,因为动态分配的内存中没有begin、end方法可供调用。 std::cout<<"test range for of dynamic array:\n"; int *darr = new int[5]{0, 1, 2, 3, 4}; // wrong. dynamic array don't has a begin method, // so we can't use range for here. //for(auto i : darr) // std::cout< for(size_t i = 0; i < 5; i++) std::cout< std::cout<<'\n'; std::cout<<"test range for of dynamic array done.\n"; 新的除法舍入规则 新标准中,重新统一了除法的舍入规则。主要需要留意两数符号不同时的规则: (-x) / y = x / (-y) = – (x / y) x % (-y) = x % y (-x) % y = – (x % y) std::cout<<"test divide:\n"; std::cout<<"10 / 3 = "<<(10 / 3)<<"\n"; std::cout<<"-10 / 3 = "<<(-10 / 3)<<"\n"; std::cout<<"-10 / -3 = "<<(-10 / (-3))<<"\n"; std::cout<<"10 % 3 = "<<(10 % 3)<<"\n"; std::cout<<"-10 % 3 = "<<(-10 % 3)<<"\n"; std::cout<<"-10 % -3 = "<<(-10 % (-3))<<"\n"; std::cout<<"10 % -3 = "<<(10 % (-3))<<"\n"; std::cout<<"test divide done.\n"< 尾置返回类型 之前,我们也见识过尾置返回类型和decltype的配合使用。有时,采用尾置返回类型,代码的可读性更高。 int (*dummy_ret1(int i))[5] { static int ret1[5] = {i, i*2, i*3, i*4, i*5}; int(*pret)[5] = &ret1; return pret; } auto dummy_ret2(int i) -> int (*)[5] { static int ret2[5] = {i+1, i+2, i+3, i+4, i+5}; int(*pret)[5] = &ret2; return pret; } std::cout<<"test trailing return type:\n"; int (*arr1)[5] = dummy_ret1(1); std::cout<<(*arr1)[0]<<'\t'<<(*arr1)[4]< int (*arr2)[5] = dummy_ret2(2); std::cout<<(*arr2)[0]<<'\t'<<(*arr2)[4]< std::cout<<"test trailing return type done.\n"; 使用字符串作为文件名 在新标准中,可以直接使用string作为文件名进行文件流处理,而不必要求C风格字符数组。 std::cout<<"test string filename:\n"; std::string filename = "regex.cpp"; std::ifstream in(filename); std::string head_ctx; in>>head_ctx; std::cout< std::cout<<"test string filename done.\n"< 字符串和数值的转换 新标准中,添加了多个函数用于string和数值之间的转换 std::cout<<"test str number cvt:\n"; int age = 15; double weight = 137.5; std::string str_age = std::to_string(age); std::string str_weight = std::to_string(weight); std::cout<<"str age: "< bind 函数 新标准中,提供了功能更强大的参数绑定函数bind,用于替换原有的bind1st和bind2nd。 int add_int(int a, int b) { return a + b; } std::cout<<"test bind:\n"; auto add5 = std::bind(add_int, std::placeholders::_1, 5); std::cout<<"add5(6): "< std::cout<<"test bind done.\n"< std::placeholders::_1表示占位符,指代第1个参数,等待后续真正调用时由用户传入。 显式类型转换 新标准中,可以指定一个类型转换为显式(explicit)的。指定为显式的类型转换,不能再进行隐式转换。 class OtherType { public: OtherType(int i) : val(i){} explicit operator int() {return val;} explicit operator bool() {return val != 0;} private: int val; }; std::cout<<"test explicit type cvt:\n"; OtherType c(10); //int i = c + 10; // wrong. can't implicit cvt c to int. int j = static_cast(c) + 10; std::cout<<"OtherType(10) + 10: "< if(c) { std::cout<<"OtherType can be cvt to bool implicitly in if clause.\n"; } std::cout<<"test explicit type cvt done.\n"< 这其中有一个例外,即,即使指定一个类型和bool类型之间的转换是显式的,在if语句中,也仍然可以执行隐式类型转换。 内联命名空间 新标准中引入了内联命名空间。内联命名空间内的名字可以不加命名空间名字前缀,直接在外层命名空间中使用。这为我们设置一个默认的命名空间提供了方便。 inline namespace InlineSpace { int inline_val1 = 1; } namespace InlineSpace { int inline_val2 = 2; } namespace NormalSpace { int normal_val3 = 3; } std::cout<<"test inline namespace:\n"; std::cout<<"inline vals: "< //std::cout<<"normal vals: "< std::cout<<"normal vals: "< std::cout<<"test inline namespace done.\n"< 只需在第一次声明内联命名空间时加上inline关键字,之后就可以省略了。 限定作用域的 enum 新标准中,可以通过enum class foo这样的形式定义一个限定作用域的枚举,其中的枚举变量在作用域之外不可见。 std::cout<<"test scoped enum:\n"; enum class number {one, two, three}; enum nation {CHN, USA, FRA}; enum nation n1 = CHN; //enum nation n2 = nation::USA; std::cout<<"unscoped enum: "< //number num1 = one; number num2 = number::two; std::cout<<"scoped enum: "<<(int)num2<<'\n'; std::cout<<"test scoped enum done.\n"; 其中,one、two、three就只能在number限定的作用域中可见,而CHN、USA、FRA就没有这个限制。 指定枚举的数据类型 新标准中,可以指定枚举的数据类型为除了int之外的其他整数类型。 std::cout<<"test enum type declare:\n"; enum long_enum { firstl = LLONG_MAX - 1, secondl = ULLONG_MAX, }; enum longlong_enum : long long { firstll = LLONG_MAX - 1, secondll = LLONG_MAX, //secondll = ULLONG_MAX }; std::cout< std::cout< std::cout<<"test enum type declare done.\n"; 输出 整个测试程序的输出结果如下: test using alias: Robert's height is 1.78 test using alias done. test range for: C H I N A lower: china test range for done. test divide: 10 / 3 = 3 -10 / 3 = -3 -10 / -3 = 3 10 % 3 = 1 -10 % 3 = -1 -10 % -3 = -1 10 % -3 = 1 test divide done. test trailing return type: 1 5 3 7 test trailing return type done. test string filename: #include test string filename done. test str number cvt: str age: 15 str weight: 137.500000 int age: 15 double weight: 137.5 test str number cvt done. test bind: add5(6): 11 test bind done. test range for of dynamic array: 0 1 2 3 4 test range for of dynamic array done. test explicit type cvt: OtherType(10) + 10: 20 OtherType can be cvt to bool implicitly in if clause. test explicit type cvt done. test inline namespace: inline vals: 1 2 normal vals: 3 test inline namespace done. test scoped enum: unscoped enum: 0 scoped enum: 1 test scoped enum done. test enum type declare: 9223372036854775806 18446744073709551615 9223372036854775806 9223372036854775807 test enum type declare done. 总结 类似typedef,新标准中可以使用using为类型声明一个别名(alias)。 range for语句可以方便的迭代对象,并且支持引用迭代。 range for不能用于动态分配内存的数组。 新标准中,重新统一了除法的舍入规则。主要需要留意两数符号不同时的规则: (-x) / y = x / (-y) = – (x / y) x % (-y) = x % y (-x) % y = – (x % y) 可以采用尾置返回类型,提高代码的可读性。 可以直接使用string作为文件名进行文件流处理,而不必要求C风格字符数组。 添加了多个函数用于string和数值之间的转换。 提供了功能更强大的参数绑定函数bind,用于替换原有的bind1st和bind2nd。 可以指定一个类型转换为显式(explicit)的。指定为显式的类型转换,不能再进行隐式转换。有一个例外,即,即使指定一个类型和bool类型之间的转换是显式的,在if语句中,也仍然可以执行隐式类型转换。 引入了内联命名空间。内联命名空间内的名字可以不加命名空间名字前缀,直接在外层命名空间中使用。 可以通过enum class foo这样的形式定义一个限定作用域的枚举,其中的枚举变量在作用域之外不可见。 可以指定枚举的数据类型为除了int之外的其他整数类型。
相关文章推荐
- [c++]Dev-c++使用C++11新特性
- C++开发者都应该使用的10个C++11特性
- 【C/C++】C++11新特性:std::bind
- 【C++】 C++11新特性
- C++模板库(包含C++11特性)
- 【C++】了解C++11新特性
- 【C++】C++11特性:右值引用与转发
- 结合C++11新特性来学习C++中lambda表达式的用法
- C++11比C++98(普通C++)的新特性
- C++开发者都应该使用的10个C++11特性
- C++开发者都应该使用的10个C++11特性
- [C++] C++11给我们带来的新特性
- 【C/C++】C++11新特性:=default 和 =delete
- C++开发者都应该使用的10个C++11特性
- C++开发者都应该使用的10个C++11特性
- C++:30分钟了解C++11新特性
- 【C++标准】之 C++11——auto特性
- [C++]C++11新特性
- C++ 左值引用和右值引用(C++11特性)
- 【C/C++】C++11新特性