【C++篇】C++11入門:踏入C++新世界的大門

文章目錄

    • C++11簡介
    • 列表初始化
      • 1. {}初始化
      • 2. initializer_list容器
        • initializer_list的使用場景
    • 聲明
      • 1. auto
      • 2. decltype
      • 3. nullptr
    • STL中的變化
      • 1. 新容器
        • array容器
        • forward_list容器
        • unordered_map和unordered_set容器
      • 2. 新接口


C++11簡介

  • C++98/03:在2003年C++標準委員會曾經提交了一份技術勘誤表(簡稱TC1),使得C++03這個名字已經取代了C++98稱為C++11之前的最新C++標準名稱。不過由于C++03(TC1)主要是對C++98標準中的漏洞進行修復,語言的核心部分則沒有改動,因此人們習慣性的把兩個標準合并稱為C++98/03標準。
  • 從C++0x到C++11:C++標準10年磨一劍,第二個真正意義上的標準珊珊來遲。相比于C++98/03,C++11則帶來了數量可觀的變化,其中包含了約140個新特性,以及對C++03標準中約600個缺陷的修正,這使得C++11更像是從C++98/03中孕育出的一種新語言。

在這里插入圖片描述

C++11能更好地用于系統開發和庫開發、語法更加泛華和簡單化、更加穩定和安全,不僅功能更強大,而且能提升程序員的開發效率,公司實際項目開發中也用得比較多,所以我們要作為一個重點去學習。

C++11全部特性參考C++官網:https://en.cppreference.com/w/cpp/11.html

小插曲
1998年是C++標準委員會成立的第一年,本來計劃以后每5年視實際需要更新一次標準,C++國際標準委員會在研究C++ 03的下一個版本的時候,一開始計劃是2007年發布,所以最初這個標準叫C++ 07。但是到06年的時候,官方覺得2007年肯定完不成C++ 07,而且官方覺得2008年可能也完不成。最后干脆叫C++ 0x。x的意思是不知道到底能在07還是08還是09年完成。結果2010年的時候也沒完成,最后在2011年終于完成了C++標準。所以最終定名為C++11。


列表初始化

1. {}初始化

C++98中?般數組和結構體可以?{}進?初始化。

struct Point
{int _x;int _y;
};
int main()
{int array1[] = { 1, 2, 3, 4, 5 };int array2[5] = { 0 };Point p = { 1, 2 };return 0;
}

C++11擴大了{}初始化的使用范圍,內置類型和用戶自定義的類型皆可用{}初始化,并且可以不寫=

struct Point
{int _x;int _y;
};
int main()
{int x1 = 1;int x2{ 2 };int array1[]{ 1, 2, 3, 4, 5 };int array2[5]{ 0 };Point p{ 1, 2 };// C++11中列表初始化也可以適用于new表達式中return 0;
}

注意:但不建議不寫=,因為影響代碼可讀性

創建對象時也可以使用列表初始化方式調用構造函數初始化

struct Point
{//explicit Point(int x, int y)Point(int x, int y):_x(x),_y(y){cout << "Point(int x, int y)" << endl;}int _x;int _y;
};int main()
{// 本質都是調用構造函數Point p0(0, 0);Point p1 = { 1,1 };  // 多參數構造函數隱式類型轉換const Point& r = { 3,3 };// C++11中列表初始化也可以適用于new表達式中(本質也是調用構造函數)int* ptr1 = new int[3]{ 1,2,3 };Point* ptr2 = new Point[2]{p0,p1};Point* ptr3 = new Point[2]{ {0,0},{1,1} };return 0;
}

2. initializer_list容器

std::initializer_list的介紹文檔
C++11中新增了initializer_list容器,該容器沒有提供過多的成員函數。
在這里插入圖片描述

  • begin和end函數,用于支持迭代器遍歷
  • size函數支持獲取容器中的元素個數。

其實,這個類的本質是底層開?個數組,將數據拷貝過來,std::initializer_list內部有兩個指針分別指向數組的開始和結束。

std::initializer_list是什么類型呢?
initializer_list本質就是一個大括號括起來的列表,如果用auto關鍵字定義一個變量來接收一個大括號括起來的列表,然后以typeid(變量名).name()的方式查看該變量的類型,此時會發現該變量的類型就是initializer_list。

int main()
{auto il = { 10, 20, 30 };cout << typeid(il).name() << endl;return 0;
}
initializer_list的使用場景

std::initializer_list一般是作為構造函數的參數,C++11對STL中的不少容器就增加了std::initializer_list作為參數的構造函數,這樣初始化容器對象就更方便了。也可以作為operator=
的參數,這樣就可以用大括號賦值。

initializer_list功能:是為了讓其他容器支持列表初始化的

一些容器之所以支持使用列表進行初始化,根本原因是因為C++11給這些容器都增加了一個構造函數,這個構造函數就是以initializer_list作為參數的。
在這里插入圖片描述
當用列表對容器進行初始化時,這個列表被識別成initializer_list類型,于是就會調用這個新增的構造函數對該容器進行初始化。

這個新增的構造函數要做的就是遍歷initializer_list中的元素,然后將這些元素依次插入到要初始化的容器當中即可。


聲明

1. auto

在C++98中auto是一個存儲類型的說明符,表明變量是局部自動存儲類型,但是局部域中定義局
部的變量默認就是自動存儲類型,所以auto就沒什么價值了。C++11中廢棄auto原來的用法,將其用于實現自動類型推斷。這樣要求必須進行顯示初始化,讓編譯器將定義對象的類型設置為初始化值的類型。

注意:auto只可以用于定義時聲明,不可單獨用來聲明一個變量,因為auto需要用左邊的值的類型推導

auto a = 10;
auto b;//不可單獨用來聲明一個變量

2. decltype

關鍵字decltype可以將變量的類型聲明為表達式指定的類型。

template<class Func>
class B
{
private:Func _f;
};int main()
{auto p = &i;auto pf = malloc;cout << typeid(p).name() << endl;cout << typeid(pf).name() << endl;//decltype推出對象的類型可以定義變量decltype(pf) pf2;//decltype推出對象的類型作為模板實參B<decltype(pf)> bb1;const int x = 1;double y = 2.2;B<decltype(x * y)> bb2;return 0;
}

decltypetypeid(變量名).name()的區別:

  • typeid(變量名).name()推出類型是一個字符串,只能看不能用
  • decltype推出對象的類型可以定義變量,或者作為模板實參

3. nullptr

由于C++中NULL被定義成字面量0,這樣就可能回帶來一些問題,因為0既能指針常量,又能表示整形常量。所以出于清晰和安全的角度考慮,C++11中新增了nullptr,用于表示空指針。

/* Define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL    0
#else  /* __cplusplus */
#define NULL    ((void *)0)
#endif  /* __cplusplus */
#endif  /* NULL */

在大部分情況下使用NULL不會存在什么問題,但是在某些極端場景下就可能會導致匹配錯誤。

當參數為整數和整型指針函數重載時,調用時實參傳NULL和nullptr是有區別的:

void f(int arg)
{cout << "void f(int arg)" << endl;
}
void f(int* arg)
{cout << "void f(int* arg)" << endl;
}
int main()
{f(NULL);    //void f(int arg)f(nullptr); //void f(int* arg)return 0;
}

因此,在C++中設置空指針使用nullptr

STL中的變化

1. 新容器

C++11中新增了四個容器,分別是array、forward_list、unordered_map和unordered_set。

array容器

array容器本質就是一個靜態數組(固定大小的數組)。

array容器有兩個模板參數,第一個模板參數代表的是存儲的類型,第二個模板參數是一個非類型模板參數,代表的是數組中可存儲元素的個數。

定義方式:

int main()
{array<int, 5> a;//定義一個可存儲5個int類型元素的array容器array<char, 10> s;////定義一個可存儲10個char類型元素的array容器
}

array其實與普通數組沒有什么區別,唯一一個區別就是:array具有嚴格的越界檢查,因為重載operator時采用了斷言檢查。

但vector似乎也不乏這個功能,甚至還有其他更加強大的功能,那有什么必要用array呢?

個人認為這個容器還是比較多余的,不推薦使用。

forward_list容器

forward_list容器本質是一個單鏈表。

我們知道,單鏈表相比于list(帶頭雙向循環鏈表)是非常雞肋的,唯一的優點就是,減少空間消耗,但微乎其微。

因此forward_list也很少使用。

unordered_map和unordered_set容器

這兩個容器是非常有價值的,筆者的其他博客對這兩個容器進行了詳細介紹。
【C++篇】STL的關聯容器:unordered_map和unordered_set(上篇):哈希表的模擬實現

2. 新接口

  1. 對于容器的迭代器:
    在這里插入圖片描述
    個人認為單獨為const迭代器提供cbegin和cend接口是沒有必要的,因為完全可以用begin和end重載它們。

  2. 所有容器均支持用{}列表初始化構造函數
    在這里插入圖片描述
    當然,這是依仗initializer_list的功勞。

  3. 所有容器新增了emplack系列
    在這里插入圖片描述
    功能和insert差不多,但性能會略高一點,后續右值引用會詳細講解。

  4. 所有容器新增了移動構造和移動賦值
    在這里插入圖片描述
    這里可以大大提升拷貝構造的性能,也是右值引用帶來的功勞。

右值引用究竟何方神圣?竟有如此大的威能?
我們下篇見分曉!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91409.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91409.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91409.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java 日期時間處理:分類、用途與性能分析

Java提供了多種日期時間處理API&#xff0c;隨著版本演進不斷改進。以下是主要日期時間類的分類、用途和性能分析&#xff1a;一、Java日期時間API分類1. 傳統日期時間API (Java 1.0/1.1)java.util.Date - 表示特定的瞬間&#xff0c;精確到毫秒java.util.Calendar - 抽象類&am…

[Linux]學習筆記系列 --GCC

文章目錄屬性__cleanup__attribute_malloc__ 用于標記函數返回一個新分配的內存塊__attribute_alloc_size__ 用于指定分配的內存大小__attribute__((const)) 標記為純函數(pure function)__attribute__((__externally_visible__)) 使其在編譯器優化過程中保持對外部模塊的可見性…

【龍澤科技】汽車維護與底盤拆裝檢修仿真教學軟件【風光580】

產品簡介汽車維護與底盤拆裝檢修仿真教學軟件是依托《全國職業院校技能大賽》“汽車維修”賽項中“汽車維護與底盤拆裝檢修模塊”競賽模塊&#xff0c;自主開發的一款仿真教學軟件。軟件采用仿真仿真技術模擬實際汽車維修工的崗位技能操作流程&#xff0c;操作內容主要包括&…

Spring之【循環引用】

目錄前置知識SingletonBeanRegistryDefaultSingletonBeanRegistrySpring中處理循環引用的流程分析定義兩個具有循環引用特點的Bean執行A的實例化執行A的屬性填充(執行過程中發現A依賴B&#xff0c;就去執行B的實例化邏輯)執行B的實例化執行B的屬性填充執行B的初始化執行A的屬性…

LRU緩存淘汰算法的詳細介紹與具體實現

LRU&#xff08;Least Recently Used&#xff0c;最近最少使用&#xff09;是一種基于時間局部性原理的緩存淘汰策略。其核心思想是&#xff1a;最近被訪問的數據在未來更可能被再次使用&#xff0c;而最久未被訪問的數據應優先被淘汰&#xff0c;從而在有限的緩存空間內保留高…

JS-第十九天-事件(一)

一、事件基礎概念1.1 事件三要素事件源&#xff1a;觸發事件的元素事件類型&#xff1a;事件的種類&#xff08;如click、mouseover等&#xff09;事件處理程序&#xff1a;響應事件的函數1.2 事件流機制事件傳播分為三個階段&#xff1a;捕獲階段&#xff1a;事件從頂層開始&a…

Matplotlib(三)- 圖表輔助元素

文章目錄一、圖表輔助元素簡介二、坐標軸的標簽、刻度范圍和刻度標簽1. 坐標軸標簽1.1 x軸標簽1.2 y軸標簽1.3 示例&#xff1a;繪制天氣氣溫折線圖2. 刻度范圍和刻度標簽2.1 刻度范圍2.1.1 x軸刻度范圍2.1.2 y軸刻度范圍2.2 刻度標簽2.2.1 x軸刻度標簽2.2.2 y軸刻度標簽2.3 示…

【Linux基礎知識系列】第七十八篇 - 初識Nmap:網絡掃描工具

在網絡管理和安全領域&#xff0c;網絡掃描是一個不可或缺的工具。它可以幫助網絡管理員了解網絡中的設備、服務以及潛在的安全漏洞。Nmap&#xff08;Network Mapper&#xff09;是一個功能強大的開源網絡掃描工具&#xff0c;它能夠快速發現網絡中的主機、端口和服務&#xf…

EasyGBS的兩種錄像回看

EasyGBS 支持兩種錄像回看&#xff0c;即“平臺端”的錄像回看和“設備端”的錄像回看。本期我們來介紹兩者的區別和使用方法。一、平臺端錄像1、什么是平臺端錄像平臺端錄像是指由 EasyGBS 平臺直接錄制并存儲。2、配置平臺端錄像進入平臺&#xff0c;依次點擊【錄像回放】→【…

大模型學習思路推薦!

為進一步貫徹落實中共中央印發《關于深化人才發展體制機制改革的意見》和國務院印發《關于“十四五”數字經濟發展規劃》等有關工作的部署要求&#xff0c;深入實施人才強國戰略和創新驅動發展戰略&#xff0c;加強全國數字化人才隊伍建設&#xff0c;持續推進人工智能從業人員…

數據庫連接池性能優化實戰

背景我們公司正在處于某個項目的維護階段&#xff0c;領導對資源告警比較重視&#xff0c;服務器資源告警的就不說了&#xff0c;運維同學每隔一小時都會檢測線上環境的應用服務信息&#xff0c;例如&#xff1a;網關日志響應時間告警/nginx日志接口響應時間告警/日志關鍵字異常…

Excel常用函數大全,非常實用

一、數學與統計函數1. SUM作用&#xff1a;求和SUM(number1, [number2], ...)SUM(A1:A10) ? 計算A1到A10單元格的總和注意&#xff1a;自動忽略文本和空單元格2. AVERAGE作用&#xff1a;計算平均值AVERAGE(number1, [number2], ...)AVERAGE(B2:B20) ? 計算B列20個數據的平均…

性能優化(一):時間分片(Time Slicing):讓你的應用在高負載下“永不卡頓”的秘密

性能優化(一)&#xff1a;時間分片&#xff08;Time Slicing&#xff09;&#xff1a;讓你的應用在高負載下“永不卡頓”的秘密 引子&#xff1a;那張讓你瀏覽器崩潰的“無限列表” 想象一個場景&#xff1a;你需要渲染一個包含一萬個項目的列表。在我們的“看不見”的應用中&a…

《C++》STL--list容器詳解

在 C 標準模板庫(STL)中&#xff0c;list 是一個非常重要的序列容器&#xff0c;它實現了雙向鏈表的數據結構。與 vector 和 deque 不同&#xff0c;list 提供了高效的插入和刪除操作&#xff0c;特別是在任意位置。本文將深入探討 list 容器的特性、使用方法以及常見操作。 文…

Day 28:類的定義和方法

DAY 28 類的定義和方法 知識點學習 1. 類的定義 在Python中&#xff0c;類是創建對象的模板。使用class關鍵字來定義一個類。類名通常采用首字母大寫的命名方式&#xff08;PascalCase&#xff09;。 # 最簡單的類定義 class MyClass:pass # 使用pass占位符類的定義就像是…

OSPF綜合實驗報告冊

一、實驗拓撲二、實驗要求1、R4為ISP&#xff0c;其上只配置IP地址&#xff1b;R4與其他所直連設備間均使用公有IP&#xff1b; 2、R3-R5、R6、R7為MGRE環境&#xff0c;R3為中心站點&#xff1b; 3、整個OSPF環境IP基于172.16.0.0/16劃分&#xff1b;除了R12有兩個環回&#x…

網絡層6——內部網關協議RIP、OSPF(重點)

目錄 一、基本概念 1、理想的路由算法應具備的特點 2、分層次的路由選擇協議 二、內部網關協議RIP 1、特點 2、路由交換信息 3、距離向量算法 4、壞消息傳送慢問題 5、RIP報文格式 三、內部網關協議OSPF 1、特點 2、其他特點 3、自治系統區域劃分 4、OSPF的5中分…

同品牌的系列廣告要如何保證宣傳的連貫性?

對于品牌的系列廣告而言&#xff0c;內容的連貫性十分重要。如果系列廣告之間缺乏內在聯系&#xff0c;不僅會削弱品牌形象的統一性&#xff0c;還可能導致用戶的認知混亂。保證宣傳內容的連貫性不是讓每則廣告完全相同&#xff0c;而是在變化中保持核心要素的一致性。我們該如…

深度學習:激活函數Activaton Function

一、為什么需要激活函數&#xff1f;神經網絡本質上是多個線性變換&#xff08;矩陣乘法&#xff09;疊加。如果沒有激活函數&#xff0c;即使疊加多層&#xff0c;整體仍等價于一個線性函數&#xff1a;這樣的網絡無法學習和擬合現實世界中復雜的非線性關系。激活函數的作用&a…

deepseek: 切分類和長函數到同名文件中

import re import sys import os import ast from tokenize import generate_tokens, COMMENT, STRING, NL, INDENT, DEDENT import iodef extract_entities(filename):"""提取類和函數到單獨文件"""with open(filename, r, encodingutf-8) as f…