C 11增加的功能特性

2021-08-28 18:42:44 字數 2194 閱讀 4326

「現代c++」這個術語在c++11發布後變得非常流行。這是什麼意思?首先,現代c++是一組模式和習語,旨在消除的缺點美好的「c類」,如此多的c++程式設計師使用,特別是如果他們開始在c,c++程式設計11看起來更簡潔易懂的方式,這是非常重要的。

c++11增加的功能特性包括:自動型別推斷;lambdas表示式;

c++11新增加了auto和decltype關鍵字。

std::mapm;

auto it = m.find(42);

//c++98: std::map::iterator it = m.find(42);

在不影響**的可讀性的情況下,縮短長型別是非常方便的。然而,這些關鍵字與模板一起變得非常廣泛,沒有必要用auto和decltype指定返回值的型別。

在64位系統中,下面的**會出錯:

string str = .....;

unsigned n = str.find("abc");

if (n != string::npos)

在64位系統下,string::npos的值要遠大於unix系統中對於unsigned型別的最大限定值。auto可以解決這個問題,變數n的型別對程式設計師而言並不重要,我們需要做的就是讓它適配string::find所有可能的取值。

string str = .....;

auto n = str.find("abc");

if (n != string::npos)

使用auto依然會有很多陷阱:

auto n = 1024 * 1024 * 1024 * 5;

char* buf = new char[n];

若本地記憶體小於5gb,auto無法解決溢位的問題。

auto也無法解決錯誤迴圈的問題:

std::vectorbigvector;

for (unsigned i = 0; i < bigvector.size(); ++i) // 對於大尺寸陣列,這個迴圈變成了乙個無限迴圈

std::vectorbigvector;

for (auto i = 0; i < bigvector.size(); ++i)

在標準c中,將陣列作為實參傳給函式時,需要意識到傳給函式形參的是乙個指標,需要用sizeof計算陣列的成員的數量。

#define rtl_number_of_v1(a)      (sizeof(a)/sizeof((a)[0]))

#define _arraysize(a) rtl_number_of_v1(a)

int getallneighbors( const ccoredispinfo *pdisp,

int ineighbors[512] )

但是在sizeof (ineighbors)中,使用sizeof計算的是指標的長度,而不是陣列的長度。int ineighbors[512]在引數中直接說明陣列的長度沒有發揮任何作用,除了給我們提醒。

使用 c++中的std::array可以避免傳統陣列的很多問題,它擁有類似vector容器的很多api。

void foo(std::arrayarray)

enum iscsi_param ;

enum iscsi_host_param ;

int iscsi_conn_get_addr_param(....,

enum iscsi_param param, ....)

return len;

}

上面函式中的引數中,列舉變數來自不同的列舉結構,產生多種不同的情況,是乙個隱性錯誤,但是只會給出warning警告。

在c++11中,您可以並且應該使用enum類:這樣的技巧在那裡不起作用,並且錯誤將出現在編譯階段。

enum class iscsi_param ;

enum class iscsi_host ;

int iscsi_conn_get_addr_param(....,

iscsi_param param, ....)

return len;

}

在c++11中被宣告棄用,在c++17中被刪除。unique_ptr取代了auto_ptr。

c 11常用特性

目錄 一 atomic 1 std atomic flag 2 std atomic 二 std thread 三 std condition variable 四 右值引用 五 std function std bind 六 lambda表示式 atomic flag 一種簡單的原子布林型別,只支...

c 11 特性學習

auto 含義改變,現為自動型別推斷 register c 11之前為建議使用cpu暫存器儲存變數,現在幾乎沒有意義 include include include include include include using namespace std initial intsum initiali...

c 11的新特性

1 型別說明符auto 2.decltype提取型別 int a 0 decltype a b b 10 cout b endl 3.基於範圍的for迴圈 4.虛函式的override和final指示符 final修飾類 類無法被繼承 final修飾虛函式 虛函式不能被重寫 override就是輔助...