C++11新特性(部分)
阿新 • • 發佈:2021-06-29
C++11 New Characters
1.auto自動型別
可以自動到多種複雜型別
// Demo
vector<int> test
// 以往遍歷
for(vector<int>::iterator it = test.begin(); it != test.end(); it++){
// ...
}
// 使用auto遍歷
for(auto it = test.begin(); it != test.end(); it++){
// ...
}
2.nullptr空指標
為指標初始化帶來曙光
// Demo // 以往使用NULL進行指標初始化,而NULL終究是一個巨集 為整型,當設計型別轉換時造成bug // nullptr可轉換為任何指標型別 int* p = nullptr; char* q = nullptr; string* s = nullptr;
3.for_each新的遍歷方式
void for_each(Iterator first, Iterator last, Function fn)
// Demo #include<algorithm> vector<int> test{2313, 341, 314, 41234, 35125, 3124} // 先前遍歷陣列,對每個元素乘二列印 for(vector<int>::iterator it = test.begin(); it != test.end(); it++) { printf("%d ", (*it) * 2); } // 使用for_each函式進行乘二列印 void duble_print(int x) { printf("%d", x * 2); } for_each(test.begin(), test.end(). double_print)
4.Lambda表示式
// 定義格式: [外部變數訪問控制](引數表)->返回值型別{函式體} // Demo auto function = [=](int x, int y)->int{ return x + y; }; printf("%d", function(30, 10)); // 打印出40 // 外部變數訪問控制說明 /* Lambda表示式特性:除了可使用引數,可通過捕獲列表訪問上下文資料 [] 不捕獲任何變數 [=] 以值傳遞方式捕獲所有父作用域變數(含this) 值傳遞方式-相當於傳遞副本,原始變數無法被修改 [&] 以引用傳遞方式捕獲所有父作用域變數(含this) [var] 值傳遞方式捕獲變數var [&var] 引用傳遞捕獲變數var [this] 值傳遞方式捕獲當前this指標 [=, &] 拷貝與引用混合 */ // Demo class Student: { void Show_Info() { auto fn = [this]()->int{/* ... */}; //捕獲this指標 } // ... }; int x = 99; int y = 134; char s '3'; auto test1 = [=]()->int{/* ... */}; //值傳遞方式捕獲了x, y, s,可在Lambda函式體中用這些變數 auto test2 = [=, &x, &y]()->int{/* ... */}; //以引用傳遞方式捕獲變數x, y, 其它變數以值傳遞方式捕獲 auto test3 = [x, y]()->int{/* ... */}; //僅以值傳遞方式捕獲x,y,變數s未被捕獲,函式體中不可使用