1. 程式人生 > 其它 >C++11新特性(部分)

C++11新特性(部分)

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未被捕獲,函式體中不可使用