文章目錄
- @[toc]
- 1.C++11的新特性有哪些
- 2.智能指針
- 3.類型推導
- 4.左值和右值
- 5.nullptr
- 6.范圍for循環
- 7.lambda表達式
- 參考
文章目錄
- @[toc]
- 1.C++11的新特性有哪些
- 2.智能指針
- 3.類型推導
- 4.左值和右值
- 5.nullptr
- 6.范圍for循環
- 7.lambda表達式
- 參考
1.C++11的新特性有哪些
- 語法的改進
(1)統?的初始化?法
(2)成員變量默認初始化
(3)auto關鍵字: 允許編譯器?動推斷變量的類型,減少類型聲明的冗余。
(4)decltype 求表達式的類型
(5)智能指針 std::shared_ptr 和 std::unique_ptr
(6)空指針 nullptr: 提供了明確表示空指針的關鍵字,替代了傳統的 NULL 。
(7)基于范圍的for循環: 簡化遍歷容器元素的語法
(8)右值引?和move語義 引?右值引?和移動構造函數,允許?效地將資源從?個對象移動到另?個對
象,提?性能。 - 標準庫擴充(往STL?新加進?些模板類)
(9)?序容器(哈希表) ?法和功能同map?模?樣,區別在于哈希表的效率更?
(10)正則表達式 可以認為正則表達式實質上是?個字符串,該字符串描述了?種特定模式的字符串
(11)Lambda表達式: 允許在代碼中定義匿名函數
2.智能指針
–
3.類型推導
- auto:auto可以讓編譯器在編譯期就推導出變量的類型
- auto的使?必須?上初始化,否則?法推導出類型
- auto在??定義多個變量時,各個變量的推導不能產??義性,否則編譯失敗
- auto不能?作函數參數
- 在類中auto不能?作?靜態成員變量
- auto不能定義數組,可以定義指針
- auto?法推導出模板參數
- 在不聲明為引?或指針時,auto會忽略等號右邊的引?類型和cv限定
- 在聲明為引?或者指針時,auto會保留等號右邊的引?和cv屬性
- decltype:decltype則?于推導表達式類型,這?只?于編譯器分析表達式的類型,表達式實際不會進?運算。
- exp是表達式,decltype(exp)和exp類型相同
- exp是函數調?,decltype(exp)和函數返回值類型相同
- 其它情況,若exp是左值,decltype(exp)是exp類型的左值引?
4.左值和右值
- 左值:指表達式結束后依然存在的持久對象。可以取地址,可以通過內置(不包含重載) & 來獲取地址,我們可以將一個右值賦給左值。
- 右值:表達式結束就不再存在的臨時對象。不可取地址,不可以通過內置(不包含重載) & 來獲取地址。由于右值不可取地址,因此我們不能將任何值賦給右值。
- 使用 = 進行賦值時,= 的左邊必須為左值,右值只能出現在 = 的右邊。
// x 是左值,666 為右值
int x = 666; // ok
int *y = x; // ok
int *z = &666 // error
666 = x; // error
int a = 9; // a 為左值
int b = 4; // b 為左值
int c = a + b // c 為左值 , a + b 為右值
a + b = 42; // error
5.nullptr
- C++11引?nullptr關鍵字來區分空指針和0。nullptr 的類型為 nullptr_t,能夠轉換為任何指針或成員指針的類型,也可以進?相等或不等的?較。
- NULL:預處理變量,是一個宏,它的值是 0,定義在頭文件 中,即 #define NULL 0。
- nullptr:C++ 11 中的關鍵字,是一種特殊類型的字面值,可以被轉換成任意其他類型。
6.范圍for循環
for(變量:對象)
std::vector<int> arr(5, 100);
for (std::vector<int>::iterator i = arr.begin(); i != arr.end(); i ++) {std::cout << *i << std::endl;
}
// 范圍for循環
for (auto &i : arr) {std::cout << i << std::endl;
}
7.lambda表達式
lambda表達式表示?個可調?的代碼單元,沒有命名的內聯函數,不需要函數名因為我們直接(?次性的)?它,不需要其他地?調?它。
- lambda表達式語法:
[capture list] (parameter list) -> return type {function body }
// [捕獲列表] (參數列表) -> 返回類型 {函數體 }
// 只有 [capture list] 捕獲列表和 {function body } 函數體是必選的
auto lam =[]() -> int { cout << "Hello, World!"; return 88; };
auto ret = lam();
cout<<ret<<endl; // 輸出88
-
lambda 表達式的特點:
- 變量捕獲才是成就lambda卓越的秘?
- [] 不捕獲任何變量,這種情況下lambda表達式內部不能訪問外部的變量
- [&] 以引??式捕獲所有變量(保證lambda執?時變量存在)
- [=] ?值的?式捕獲所有變量(創建時拷?,修改對lambda內對象?影響)
- [=, &foo] 以引?捕獲變倆個foo, 但其余變量都靠值捕獲
- [&, foo] 以值捕獲foo, 但其余變量都靠引?捕獲
- [bar] 以值?式捕獲bar; 不捕獲其它變量
- [this] 捕獲所在類的this指針
- 變量捕獲才是成就lambda卓越的秘?
-
lambda最?的?個優勢是在使?STL中的算法(algorithms)庫
參考
Leetcodec++面試突破
代碼隨想錄–最強八股文c++