国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

面試之快速學習c++11- 列表初始化和 lambda匿名函數(shù)的定義

這篇具有很好參考價值的文章主要介紹了面試之快速學習c++11- 列表初始化和 lambda匿名函數(shù)的定義。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

學習地址: http://c.biancheng.net/view/3730.html

8. C++11列表初始化(統(tǒng)一了初始化方式)

  1. 我們知道,在 C++98/03 中的對象初始化方法有很多種,請看下面的代碼:
//初始化列表
int i_arr[3] = { 1, 2, 3 };  //普通數(shù)組
struct A1
{
    int x;
    struct B
    {
        int i;
        int j;
    } b;
} a = { 1, { 2, 3 } };  //POD類型: POD 類型即 plain old data 類型,簡單來說,是可以直接使用 memcpy 復制的對象。

//拷貝初始化(copy-initialization)
int i = 0;
class Foo1
{
    public:
    Foo1(int) {}
} foo = 123;  //注意這里需要拷貝構造函數(shù)

//直接初始化(direct-initialization)
int j(0);
Foo1 bar(123);

2 .為了統(tǒng)一初始化方式,并且讓初始化行為具有確定的效果,C++11 中提出了列表初始化(List-initialization)的概念。

3 . 在上面我們已經看到了,對于普通數(shù)組和 POD 類型,C++98/03 可以使用初始化列表(initializer list)進行初始化,但是這種初始化方式的適用性非常狹窄,只有上面提到的這兩種數(shù)據(jù)類型可以使用初始化列表。

4 . 在 C++11 中,初始化列表的適用性被大大增加了。它現(xiàn)在可以用于任何類型對象的初始化,請看下面的代碼。

class Foo2
{
public:
    Foo2(int) {}
private:
    Foo2(const Foo2 &);
    Foo2 operator=(const Foo2 &);
};

void testInitializer (){
    Foo2 a1(123);
    Foo2 a2 = 123;  //網站上面說 會報錯error: 'Foo::Foo(const Foo &)' is private。但是我用xcode沒有報錯,斷點進入到了Foo2(int) {}
    Foo2 a3 = {123};
    Foo2 a4{123};
    
}

5 . a3、a4 使用了新的初始化方式來初始化對象,效果如同 a1 的直接初始化, 這里需要注意的是,a3 雖然使用了等于號,但它仍然是列表初始化,因此,私有的拷貝構造并不會影響到它。

6 . 注意我把第一個構造函數(shù)改為 explicit Foo2(int) {}之后 a2, a3報錯

7 . 如果真的要用初始化列表,那么最好用a4這種

8 . 另外,如同讀者所想的那樣,new 操作符等可以用圓括號進行初始化的地方,也可以使用初始化列表:


int* a1 = new int { 123 };
double b1 = double { 12.12 };
int* arr1 = new int[3] { 1, 2, 3 };

9 . 除了上面所述的內容之外,列表初始化還可以直接使用在函數(shù)的返回值上:

struct Foo3 {
    Foo3(int i, double j){}
};
Foo3 func3() {
    return {1, 3};

9. lambda匿名函數(shù)的定義

  1. 定義一個 lambda 匿名函數(shù)很簡單,可以套用如下的語法格式:

[外部變量訪問方式說明符] (參數(shù)) mutable noexcept/throw() -> 返回值類型 {
函數(shù)體; };

1) [外部變量方位方式說明符]
[ ] 方括號用于向編譯器表明當前是一個 lambda 表達式,其不能被省略。在方括號內部,可以注明當前 lambda 函數(shù)的函數(shù)體中可以使用哪些“外部變量”。
所謂外部變量,指的是和當前 lambda 表達式位于同一作用域內的所有局部變量。

2) (參數(shù))
和普通函數(shù)的定義一樣,lambda 匿名函數(shù)也可以接收外部傳遞的多個參數(shù)。和普通函數(shù)不同的是,如果不需要傳遞參數(shù),可以連同 () 小括號一起省略;

3) mutable
此關鍵字可以省略,如果使用則之前的 () 小括號將不能省略(參數(shù)個數(shù)可以為 0)。默認情況下,對于以值傳遞方式引入的外部變量,不允許在 lambda 表達式內部修改它們的值(可以理解為這部分變量都是 const 常量)。而如果想修改它們,就必須使用 mutable 關鍵字。
注意,對于以值傳遞方式引入的外部變量,lambda 表達式修改的是拷貝的那一份,并不會修改真正的外部變量;

4) noexcept/throw()
可以省略,如果使用,在之前的 () 小括號將不能省略(參數(shù)個數(shù)可以為 0)。默認情況下,lambda 函數(shù)的函數(shù)體中可以拋出任何類型的異常。而標注 noexcept 關鍵字,則表示函數(shù)體內不會拋出任何異常;使用 throw() 可以指定 lambda 函數(shù)內部可以拋出的異常類型。

值得一提的是,如果 lambda 函數(shù)標有 noexcept 而函數(shù)體內拋出了異常,又或者使用 throw() 限定了異常類型而函數(shù)體內拋出了非指定類型的異常,這些異常無法使用 try-catch 捕獲,會導致程序執(zhí)行失?。ū竟?jié)后續(xù)會給出實例)。

5) -> 返回值類型
指明 lambda 匿名函數(shù)的返回值類型。值得一提的是,如果 lambda 函數(shù)體內只有一個 return 語句,或者該函數(shù)返回 void,則編譯器可以自行推斷出返回值類型,此情況下可以直接省略-> 返回值類型。

6) 函數(shù)體
和普通函數(shù)一樣,lambda 匿名函數(shù)包含的內部代碼都放置在函數(shù)體中。該函數(shù)體內除了可以使用指定傳遞進來的參數(shù)之外,還可以使用指定的外部變量以及全局范圍內的所有全局變量。

2 . ??需要注意的是,外部變量會受到以值傳遞還是以引用傳遞方式引入的影響,而全局變量則不會。換句話說,在 lambda 表達式內可以使用任意一個全局變量,必要時還可以直接修改它們的值。

3 . 比如,如下就定義了一個最簡單的 lambda 匿名函數(shù):[]{}

4 . 外部變量格式 功能
[] 空方括號表示當前 lambda 匿名函數(shù)中不導入任何外部變量。
[=] 只有一個 = 等號,表示以值傳遞的方式導入所有外部變量;
[&] 只有一個 & 符號,表示以引用傳遞的方式導入所有外部變量;
[val1,val2,…] 表示以值傳遞的方式導入 val1、val2 等指定的外部變量,同時多個變量之間沒有先后次序;
[&val1,&val2,…] 表示以引用傳遞的方式導入 val1、val2等指定的外部變量,多個變量之間沒有前后次序;
[val,&val2,…] 以上 2 種方式還可以混合使用,變量之間沒有前后次序。
[=,&val1,…] 表示除 val1 以引用傳遞的方式導入外,其它外部變量都以值傳遞的方式導入。
[this] 表示以值傳遞的方式導入當前的 this 指針。

5 . ??注意,單個外部變量不允許以相同的傳遞方式導入多次。例如 [=,val1] 中,val1 先后被以值傳遞的方式導入了 2 次,這是非法的。文章來源地址http://www.zghlxwxcb.cn/news/detail-639270.html


void testLambda() {
    int num[4]{2,5,3,4};
    sort(num, num+4, [num](int x, int y)->bool{return x < y;});
    cout<< "sort:" <<endl;
    for (auto &n: num) {
        cout<< n <<endl;
    }
}

到了這里,關于面試之快速學習c++11- 列表初始化和 lambda匿名函數(shù)的定義的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 初始化列表

    初始化列表

    ?在創(chuàng)建對象時,編譯器通過調用構造函數(shù),給對象中各個成員變量一個合適的初始值。 雖然上述構造函數(shù)調用之后,對象中已經有了一個初始值,但是不能將其稱為對對象成員變量的初始化,構造函數(shù)體中的語句只能將其稱為賦初值,而不能成作初始化。因為 初始化只能進

    2024年02月04日
    瀏覽(20)
  • 初始化列表的使用

    初始化列表的使用

    問題 類中是否可以定義 const 成員? 可以的 下面的類定義是否合法? 如果合法,ci 的值是什么,存儲在哪里? 上面的 Test 類定義是合法的,但是要定義 Test 類對象的時候,編譯器會報錯,提示 const 成員變量 ci 沒初始化 類中的 const 成員 我們對上面的代碼進行編譯,編譯直

    2024年02月09日
    瀏覽(19)
  • 【深度學習】 Python 和 NumPy 系列教程(三):Python容器:1、列表List詳解(初始化、索引、切片、更新、刪除、常用函數(shù)、拆包、遍歷)

    【深度學習】 Python 和 NumPy 系列教程(三):Python容器:1、列表List詳解(初始化、索引、切片、更新、刪除、常用函數(shù)、拆包、遍歷)

    目錄 一、前言 二、實驗環(huán)境 三、Python容器(Containers) 0、容器介紹 1、列表(List) 1. 初始化 a. 創(chuàng)建空列表 b. 使用現(xiàn)有元素初始化列表 c. 使用列表生成式 d. 復制列表 2. 索引和切片 a. 索引 b. 負數(shù)索引 c. 切片 3. 常用操作(更新、刪除) a. 更新單個元素 b. 更新切片 c. 刪除單

    2024年02月09日
    瀏覽(25)
  • C++之初始化列表詳細剖析

    C++之初始化列表詳細剖析

    初始化列表:以一個 冒號開始 ,接著是一個以 逗號分隔的數(shù)據(jù)成員列表 ,每個 \\\"成員變量\\\" 后面跟一個 放在括號中的初始值或表達式。 不知道大家有沒有想過這樣一個問題,成員函數(shù)明明可以在函數(shù)內部對成員變量進行賦值,那為什么還要搞出初始化列表這個東西呢?這個

    2024年02月06日
    瀏覽(28)
  • C++ | 談談構造函數(shù)的初始化列表

    C++ | 談談構造函數(shù)的初始化列表

    我們知道,對于下面這個類A的成員變量 _a1 和 _a2 屬于【聲明】,還沒有在內存中為其開辟出一塊空間以供存放,真正開出空間則是在【定義】的時候,那何時定義呢?也就是使用這個類A去實例化出對象的時候 這個對象的空間被開出來了,難道里面的成員變量就一定開出空間

    2023年04月11日
    瀏覽(29)
  • 【C++奇遇記】構造函數(shù) | 初始化列表

    【C++奇遇記】構造函數(shù) | 初始化列表

    ?? 博客主頁:博主鏈接 ?? 本文由 M malloc 原創(chuàng),首發(fā)于 CSDN?? ?? 學習專欄推薦:LeetCode刷題集 數(shù)據(jù)庫專欄 初階數(shù)據(jù)結構 ?? 歡迎點贊 ?? 收藏 ?留言 ?? 如有錯誤敬請指正! ?? 未來很長,值得我們全力奔赴更美好的生活? ??本篇文章將講授C++的初始化列表相關的知識

    2024年02月12日
    瀏覽(22)
  • C++中包含初始化列表的構造函數(shù)

    構造函數(shù)對初始化成員變化很有用。另一種初始化成員的方式是使用初始化列表。對于程序中接受兩個參數(shù)的構造函數(shù),其包含初始化列表的變種類似于下面這樣: 格式為: :成員變量1(參數(shù)1),成員變量2(參數(shù)2) 編譯器會將初始化列表一一轉換成代碼,并將這些代碼放

    2024年02月05日
    瀏覽(27)
  • C++:初始化列表,static成員,友元,內部類

    C++:初始化列表,static成員,友元,內部類

    個人主頁 : 個人主頁 個人專欄 : 《數(shù)據(jù)結構》 《C語言》《C++》 本篇博客作為C++:初始化列表,static成員,友元,內部類的知識總結。 初始化列表:以冒號開始,接著是一個以逗號分隔的數(shù)據(jù)成員列表,每個“成員變量”后面跟一個放在括號中的初始值或表達式。 初始化

    2024年02月07日
    瀏覽(29)
  • 【C++】構造函數(shù)和初始化列表的性能差距

    【C++】構造函數(shù)和初始化列表的性能差距

    構造函數(shù)和初始化列表的性能差距對比測試 在C++類和對象中,你可能聽到過更加推薦用初始化列表來初始化類內成員。如果類內成員是自定義類型,則只能在初始化列表中調用自定義類型的構造函數(shù)。 但初始化列表和在構造函數(shù)體內直接賦值有無性能差距呢?今天就用一份

    2024年02月11日
    瀏覽(39)
  • 【C++】初始化列表構造函數(shù)VS普通構造函數(shù)

    初始化列表構造函數(shù)最優(yōu)先匹配問題 對于一個類而言,只要其中包含有初始化列表的構造函數(shù),編譯器在編譯使用{}語法的構造時會最傾向于調用初始化列表構造函數(shù),哪怕做類型轉換也在所不惜,哪怕有類型最佳匹配的普通構造函數(shù)或移動構造函數(shù)也會被劫持 編譯器這種熱

    2024年02月05日
    瀏覽(41)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包