程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++第11版本中的一些壯大的新特征小結

C++第11版本中的一些壯大的新特征小結

編輯:關於C++

C++第11版本中的一些壯大的新特征小結。本站提示廣大學習愛好者:(C++第11版本中的一些壯大的新特征小結)文章只能為提供參考,不一定能成為您想要的結果。以下是C++第11版本中的一些壯大的新特征小結正文


Auto Type Deduction 主動類型推導

auto 症結字讓用戶得以應用 C++ 內置的類型推導特征。

std::string something = somethingthatreturnsastring.getString();
auto something = somethingthatreturnsastring.getString();

Auto 症結字會對上述自變量(something)停止主動推導,得出其應當是 string 類型的結論,並在 auto 湧現的處所用准確的類型停止調換。這個特征對迭代器特殊有效。

for(std::vector<T>::iterator it = x.begin(); it != x.end(); i++)
{
  it->something();
}

上述代碼可以寫成:

for(auto it = x.begin(); it != x.end(); i++)
{
  it->something();
}

贊! 代碼看上去簡練多了!

Strongly Typed Enums 強類型列舉

這個特征可以有用防止列舉類型的定名抵觸,從而清除許多潛伏的 bug。在舊版本的 C++ 中,法式員必需為每個列舉項設定一個全局獨一的名字。例如,假如你給一個列舉項取名叫 None,那末其他的列舉聚集就不克不及再用這個名字了。然則如今,你可以這麼做了!(譯注:作者上面給的例子似乎和下面的文字不長短常搭配//myEnum ::All 和 myEnum::All是否是存在差別?)

enum class myEnum {None, One, All};
myEnum o = myEnum ::All;
auto p = myEnum::All; 
// 異樣有用

Lambdas 表達式

Lambda 表達式簡略說就是個匿名函數(譯注:原文為in-place function,意思是“用來鑲嵌的函數”,然則匿名函數能更准確表達這個寄義)。關於迭代器和for 輪回異常有效,這類函數你只須要在法式的某一處應用一次,所以沒有需要專門在法式裡明白界說它。Lambda 表達式並沒有讓 C++ 在邏輯表達上做到“及以往之弗成及”的水平,它是一種受函數式編程思惟影響而引入的說話特征,可以或許讓法式更緊湊。Lambda 表達式的最簡情勢是上面如許的:

[]() { }

加上一切能夠的操作符,會是如許:

[]() mutable -> T { }
個中[]是捕捉列表,()是參數列表,{}是函數體

Capture List 捕捉列表

捕捉列表界說了甚麼類型的器械可以從 Lambda 表達式以外婚配到函數體中來。可以包括以下這些:

一個值:[x]
一個援用 [&x]
以後規模內隨意率性變量的援用 [&]
同3,然則經由過程變量的值
你可以對下面的各項停止隨意率性混雜,只需用逗號離隔便可 [x, &y]

Argument List 參數列表

參數列表和 C++ 函數的參數列表是一個概念。

Function Body 函數體

函數體是指在 Lambda 表達式被挪用時真正履行的代碼。

Return Type Deduction

前往值揣摸

假如 Lambda 表達式只要一個前往聲明,那末前往值類型便可以省略,其類型就是隱式類型:decltype(return_statement)

可變 Labmda

假如一個 Lambda 表達式被標志為 mutable(例如:[]() mutable{ }),那末關於按值捕捉的數值來講,在函數體內就許可對這些值停止修正操作。

上面舉個例子:

int main()
{
  char s[]="Hello World!";
  int Uppercase = 0; 
//lambda會轉變這個變量的值
  for_each(s, s+sizeof(s), [&Uppercase] (char c) {
  if (isupper(c))
   Uppercase++;
  });
 cout<< Uppercase<<" uppercase letters in: "<< s<<endl;
}

Unique 指針

Unique 指針是 C++11 版本的智能指針類。

一旦你用 unique_ptr 症結字界說了一個對象,那末以下事宜只需產生一個,對象就會被燒毀並釋放內存:

unique_ptr 治理的對象被燒毀。
unique_ptr 治理的對象經由過程賦值操作符指向另外一個指針,或挪用了reset()辦法。
關於不想懂得太多細節的用戶來講,這就意味著假如你應用了 unique 指針的語義,那末在跳出感化域之前,你就不消手動收受接管對象的內存了。

之前,我們須要這麼寫代碼:

YourObject * obj = new YourObject();

然後在法式的最初你必定要記得釋放內存:

delete(obj);
不然你可就形成內存洩漏了。而如今,

std::unique_ptr<YourObject> obj(new YourObject());

當 obj 跳出感化域規模以外的時刻,內存將會被主動收受接管。

static_assert

static_assert 簡略說就是一個在編譯期履行的斷言。例如,你可以這麼做:

static_assert(sizeof(unsigned int) * CHAR_BIT == 32);

假定因為體系的緣由形成了上述的邏輯斷定的掉敗,那末 static_assert 就會斷言掉敗。

它的另外一種用處,是和 C++ 特點類型搭配應用。好比:

static_assert(std::is_pod<yourstruct>::value, "Not a pod struct!");

POD 是指“簡略數據”(Plain Old Data)構造,也就是說,它是一個的類(你可以用struct症結字界說,也能夠用class症結字界說),但沒有結構函數,析構函數和虛成員函數。所以,假如一個愚昧的菜鳥法式員妄圖給這類類型增長結構函數的話,static_assert 就會在編譯的時刻阻攔這類行動,並報錯。這對代碼保護來講可長短常有效的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved