文章插图
C++新特性新特性主要包括两个方面:语法改进、标准库扩充
- 语法改进
#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 求表达式的类型
(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
#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; }
运行结果:文章插图
- 空指针nullptr(原来的NULL)
【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;}
运行结果:文章插图
- 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语义
C++98/03标准中,引用使用的是“&” 。这引用方式有一个缺陷,即正常情况下,只能操作 C++ 中的左值,无法对右值添加引用 。
推荐阅读
- 谷歌Chrome浏览器正获得全新截图工具
- 互联网革命的新赛道——Web3.0
- iQOO|新一代千元“神机”!iQOO Neo6 SE入网信息曝光:骁龙870+80W快充
- 圣莫尼卡|比恶魔猎手更强大!魔兽世界10.0新职业唤魔师诠释何为真正英雄
- 怎么买玉
- 穿衣搭配|公务员迎来“新政策”,招考或将成了过去式,这些考生别错过了!
- 新疆和北京的时差是几个小时?
- 怎么自制红茶,新鲜苦瓜茶的泡法
- 如何加快新陈代谢
- 大众|人人开得起!曝大众将打造全新入门级电动车