C++11新特性概述,初始化,auto、for、智能指针、哈希表等


C++11新特性概述,初始化,auto、for、智能指针、哈希表等

文章插图
 
C++新特性新特性主要包括两个方面:语法改进、标准库扩充
  • 语法改进
(1)统一的初始化方法
#include<IOStream>using namespace std;class Test{public: int value; Test(int num) {value = https://www.isolves.com/it/cxkf/yy/C/2022-05-06/num; } Test(const Test& test) {value = test.value; }};
  • 成员变量默认初始化
优点:构造类对象时,不需要构造函数初始化成员变量 。
#include<iostream>using namespace std;class A{public: int m = 1234; int n;};int main(){ Aa; cout << a.m << endl; return 0;}
  • auto 关键字
编译器自动判定变量类型 。
#include<iostream>#include<vector>using namespace std;int main(){ vector<int> vec1{ 1,2,3,4 }; //vector<int>::iterator ite = vec1.begin(); auto ite = vec1.begin(); cout << *(ite++) << endl; cout << *ite << endl; return 0;}
  • decltype 求表达式的类型
decltype 和auto功能相似,编译时自动类型推导 。
(1)为什么要有delctype
auto并不适用于任何类型推导,或是使用不便,亦或是无法使用 。两者区别:
auto varname = value; decltype(exp) varname = value;varname 表示变量名,value 表示赋给变量的值,exp 表示一个表达式 。
auto 根据"="右边的初始值 value 推导出变量的类型,而 decltype 根据 exp 表达式推导出变量的类型,跟"="右边的 value 没有关系 。所以auto要求变量必须初始化,而decltype不需要 。
//b 被推导成了 intint a = 0; decltype(a) b = 1;//x 被推导成了 doubledecltype(10.8) x = 5.5;//y 被推导成了 doubledecltype(x + 100) y;
  • 智能指针shared_ptr
和 unique_ptr、weak_ptr 不同之处在于,多个 shared_ptr 智能指针可以共同使用同一块堆内存.
#include <iostream> #include <memory> using namespace std; int main() {//构建 2 个智能指针shared_ptr<int> p1(new int(10));shared_ptr<int> p2(p1);//输出 p2 指向的数据cout << *p2 << endl;p1.reset();//引用计数减 1,p1为空指针if (p1){cout << "p1 不为空" << endl; } else{cout << "p1 为空" << endl;}//以上操作,并不会影响 p2cout << *p2 << endl;//判断当前和 p2 同指向的智能指针有多少个cout << p2.use_count() << endl;return 0; }运行结果:
 
C++11新特性概述,初始化,auto、for、智能指针、哈希表等

文章插图
 
  • 空指针nullptr(原来的NULL)
nullptr 是 nullptr_t 类型的右值常量,专用于初始化空类型指针 。也就是说,nullptr 仅为 nullptr_t 类型的一个实例化对象 。同时,nullptr可以被隐式转化位任意类型 。
【C++11新特性概述,初始化,auto、for、智能指针、哈希表等】int * x1 = nullptr;char * x2 = nullptr;double * x3 = nullptr;显然,然后类型指针变量都可以用 nullptr 进行初始化 。同时,将指针变量初始化为nullptr,能够解决NULL遗留的问题 。
#include<iostream>using namespace std;void isNull(void* ptr){ cout << "void* ptr" << endl;}void isNull(int m){ cout << "int m" << endl;}int main(){ isNull(NULL); isNull(nullptr); return 0;}运行结果:
 
C++11新特性概述,初始化,auto、for、智能指针、哈希表等

文章插图
 
  • for遍历
for(元素:对象){//循环体}#include<iostream>#include<string>#include<vector>#include<map>using namespace std;int main(){ //普通数组遍历 char arr[] = { "www.Abin.com" }; for (auto e : arr) {cout << e ; } cout << endl; //字符串遍历 stringstr1 = { "www.Abin.com" }; for (auto e : str1) {cout << e; } cout << endl; //vector 容器遍历 vector<string> vec = {"我","喜欢","豆包"}; for (auto e : vec) {cout << e ; } cout << endl; //map 遍历 map<int, string> hash_map = { {1,"我"},{2,"喜欢"},{3,"豆包"} }; for (auto e : hash_map) {cout << e.first << "t" << e.second << endl; } return 0;}
  • 右值引用和move语义
(1)右值引用
C++98/03标准中,引用使用的是“&” 。这引用方式有一个缺陷,即正常情况下,只能操作 C++ 中的左值,无法对右值添加引用 。


推荐阅读