日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++17新特性学习笔记

發布時間:2023/12/10 c/c++ 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++17新特性学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

c++17最新特性筆記

1.基本語言特性

? 這一部分介紹了 C++17中新的核心語言特性,但不包括那些專為泛型編程(即 template)設計的特性。

結構化綁定

結構化綁定允許你用一個對象的元素或對象初始化多個實例(第一眼感覺Python解包很像)

這有一個結構體

struct MyStruct {int i = 0;std::string s; }; MyStruct ms;

可以通過如下聲明把該結構體的兩個成員綁定到新的變量名

auto [u, v] = ms; auto [u1, v1] {ms}; auto [u2, v2] (ms);

結構化綁定對于返回結構體或者數組的函數非常有用

MyStruct returnStruct() {return MyStruct{ 42,"Tom" }; }

我們可以把結構體中的成員變量分別賦值給兩個新的局部變量

auto [id, name] = returnStruct();

還可以再進行操作

if (id>16){/*...*/}

結構化綁定還能大幅提高代碼的可讀性

例如:

不使用結構化綁定,對std::map的遍歷需要這么寫

for (auto& elem : m1){cout << elem.first << elem.second;}

下面是使用結構化綁定:

for (const auto& [key,value] : m1){cout << key << value << endl;}

增加了代碼的可讀性(真的越來越現代了cpp)

1.1.1細說結構化綁定

綁定到一個匿名實體

auto [u, v] = ms;

這段代碼實際上是做了如下操作:

auto e = ms; ... u = e.i; ... v = e.s;

這就意味這u,v是結構體內成員變量的拷貝(拷貝對象e的生命周期和結構化綁定一樣長)

e 的生命周期和結構化綁定的生命周期相同,當結構化綁定離開作用域時 e 也會被自動銷毀。另外,除非使用了引用,否則修改結構化綁定的變量并不會影響被綁定的變量:

MyStruct ms{42, "hello"}; auto [u, v] = ms; ms.i = 77;

使用修飾符

我們可以在結構化綁定中使用修飾符,例如 const 和引用,這些修飾符會作用在匿名實體 e 上。通常情況

下,作用在匿名實體上和作用在結構化綁定的變量上的效果是一樣的,但有些時候又是不同的(見下文)。

例如,我們可以把聲明一個結構化綁定聲明為 const 引用:

const auto& [u, v] = ms; // 引 用, 因 此u/v指 向ms.i/ms.s

這里,匿名實體被聲明為 const引用,而u 和 v 分別是這個引用的成員 i 和s 的別名。因此,對ms 的成員的修

改會影響到 u 和 v 的值:

ms.i = 77; // 影 響u的 值std::cout << u; // 打 印 出77

如果聲明為非 const引用,你甚至可以修改對象的成員:

MyStruct ms{42, "hello"};auto& [u, v] = ms; // 被 初 始 化 的 實 體 是ms的 引 用ms.i = 77; // 影 響 到u的 值std::cout << u; // 打 印 出77u = 99; // 修 改 了ms.istd::cout << ms.i; // 打 印 出99

如果一個結構化綁定是引用類型,而且是對一個臨時對象的引用,那么和往常一樣,臨時對象的生命周期會被

延長到結構化綁定的生命周期:

MyStruct getStruct();...const auto& [a, b] = getStruct();std::cout << "a: " << a << '\n'; // OK

修飾符并不是作用在結構化綁定引入的變量名上

修飾符會作用在新的匿名實體上(即上文中的e)而不會是u,v上

const auto&[u,v] = ms;

u和v都不是引用,只有匿名實體e是引用。u 和 v 分別是 ms 對應的成員的類型,只不過變成了const 的。根據我們的推導,decltype(u) 是 const int,decltype(v) 是const std::string。

結構體綁定適用的場景

原則上講,結構化綁定適用于所有只有 public 數據成員的結構體、C風格數組和類似元組 (tuple--like)的對象:

? 對于所有非靜態數據成員都是 public 的結構體和類,你可以把每一個成員綁定到一個新的變量名上。

? 對于原生數組,你可以把數組的每一個元素都綁定到新的變量名上。

? 對于任何類型,你可以使用 tuple-like API 來綁定新的名稱,無論這套 API 是如何定義“元素”的。對于一個類型 type這套 API 需要如下的組件:

  • std::tuple_size<type>::value 要返回元素的數量。

  • std::tuple_element<idx, type>::type 要返回第 idx 個元素的類型。

  • 一個全局或成員函數 get<idx>() 要返回第 idx 個元素的值。

注意要使用結構化綁定需要繼承時遵循一定的規則。所有的非靜態數據成員必須在同一個類中定義(也就是說,這些成員要么是全部直接來自于最終的類,要么是全部來自同一個父類):

struct B {int a = 0;int b = 3; };struct B1 :B {int c = 4; }; auto [x, y] = B{};//OK auto [x1, y1, z1] = B1{};//ERROR

原生數組

int arr[] = { 1,2 }; auto [a1, b1] = arr; //按值拷貝

std::pair, std::tuple std::array

總結

以上是生活随笔為你收集整理的C++17新特性学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。