牛客網C++面經 C++11

請問C++11有哪些新特性?

  • auto關鍵字:編譯器可以根據初始值自動推導出類型。但是不能用于函數傳參以及數組類型的推導
  • nullptr關鍵字:nullptr是一種特殊類型的字面值,它可以被轉換成任意其它的指針類型;而NULL一般被宏定義為0,在遇到重載時可能會出現問題。
  • 智能指針:C++11新增了std::shared_ptr、std::weak_ptr等類型的智能指針,用于解決內存管理的問題。
  • 初始化列表:使用初始化列表來對類進行初始化
  • 右值引用:基于右值引用可以實現移動語義和完美轉發,消除兩個對象交互時不必要的對象拷貝,節省運算存儲資源,提高效率
  • atomic原子操作用于多線程資源互斥操作
  • 新增STL容器array以及tuple

請你詳細介紹一下C++11中的可變參數模板、右值引用和lambda這幾個新特性。

可變參數模板:

  • C++11的可變參數模板,對參數進行了高度泛化,可以表示任意數目、任意類型的參數,其語法為:在class或typename后面帶上省略號”。

例如:

Template<class ... T>
void func(T ... args)
{
cout<<”num is”<<sizeof ...(args)<<endl;
}
  • func();//args不含任何參數
  • func(1);//args包含一個int類型的實參
  • func(1,2.0)//args包含一個int一個double類型的實參
  • 其中T叫做模板參數包,args叫做函數參數包

省略號作用如下:

  • 1)聲明一個包含0到任意個模板參數的參數包
  • 2)在模板定義得右邊,可以將參數包展成一個個獨立的參數
  • C++11可以使用遞歸函數的方式展開參數包,獲得可變參數的每個值。通過遞歸函數展開參數包,需要提供一個參數包展開的函數和一個遞歸終止函數。例如:
#include using namespace std;// 最終遞歸函數void print()
{
cout << "empty" << endl;
}// 展開函數
template void print(T head, Args... args)
{
cout << head << ","; print(args...);
}
int main()
{
print(1, 2, 3, 4); return 0;
}
  • 參數包Args ...在展開的過程中遞歸調用自己,每調用一次參數包中的參數就會少一個,直到所有參數都展開為止。當沒有參數時就會調用非模板函數printf終止遞歸過程。

補充

  • 模板簡單學習
  • C++ 模板
#include <iostream>
#include <vector>template <class T>
class Stack{
private:std::vector<T> elements;//元素
public:void push(T const&);//入棧void pop();//出棧T top() const;//返回棧頂元素bool empty() const{//如果為空返回真return elements.empty();}
};template<class T>
void Stack<T>::push(const T &elem) {//追加元素的副本elements.template emplace_back(elem);
}
template<class T>
void Stack<T>::pop() {if (elements.empty()){throw std::out_of_range("Stack<>::pop():empty stack");}//刪除元素elements.pop_back();
}template <class T>
T Stack<T>::top() const {if (elements.empty()){throw std::out_of_range("Stack<>::top():empty stack");}//返回第一個元素的副本return elements.back();
}int main(int argc,char* argv[])
{try {Stack<int> int_stack{};Stack<std::string> string_stack{};//操作 int 類型的棧int_stack.push(7);std::cout << int_stack.top() << std::endl;//操作 string 類型的棧string_stack.push("hello");std::cout << string_stack.top() << std::endl;string_stack.pop();string_stack.pop();} catch (std::exception const&ex) {std::cerr << "Exception:" << ex.what() << std::endl;return -1;}return 0;
}

右值引用:

  • C++中,左值通常指可以取地址,有名字的值就是左值,而不能取地址,沒有名字的就是右值。而在指C++11中,右值是由兩個概念構成,將亡值和純右值。純右值是用于識別臨時變量和一些不跟對象關聯的值,比如1+3產生的臨時變量值,2、true等,而將亡值通常是指具有轉移語義的對象,比如返回右值引用T&&的函數返回值等。
  • C++11中,右值引用就是對一個右值進行引用的類型。由于右值通常不具有名字,所以我們一般只能通過右值表達式獲得其引用
  • 基于右值引用可以實現轉移語義和完美轉發新特性。
  • 參見原文

Lambda表達式

  • Lambda表達式定義一個匿名函數,并且可以捕獲一定范圍內的變量,其定義如下:
  • [capture](params)mutable->return-type{statement}
  • [capture]:捕獲列表,捕獲上下文變量以供lambda使用。同時[]是lambda寅初復,編譯器根據該符號來判斷接下來代碼是否是lambda函數。
  • (Params):參數列表,與普通函數的參數列表一致,如果不需要傳遞參數,則可以連通括號一起省略。
  • mutable是修飾符,默認情況下lambda函數總是一個const函數,Mutable可以取消其常量性。在使用該修飾符時,參數列表不可省略。
  • ->return-type:返回類型是返回值類型
  • {statement}:函數體,內容與普通函數一樣,除了可以使用參數之外,還可以使用所捕獲的變量。
  • Lambda表達式與普通函數最大的區別就是其可以通過捕獲列表訪問一些上下文中的數據。其形式如下:

  • Lambda的類型被定義為“閉包”的類,其通常用于STL庫中,在某些場景下可用于簡化仿函數的使用,同時Lambda作為局部函數,也會提高復雜代碼的開發加速,輕松在函數內重用代碼,無須費心設計接口。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446541.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446541.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446541.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言 返回指針的函數--指針函數 int* max(int a)

定義 strlong示例代碼 代碼1: #include<stdio.h> #include<string.h> //返回指針的函數//比較兩個字符串,返回更長的字符串 char *strlong(char* a,char* b) {char *p1&a[0];char *p2&b[0];while(true){if(*p1\0){return b;}else if(*p2\0){return a;}p1…

第2、3講 圖像的存儲格式

本圖像處理系列筆記是基于B站楊淑瑩老師的課程進行學習整理的。 文章目錄黑白圖像8位灰度索引圖像8位偽彩色索引圖像24位真彩色圖像圖像文件格式BMP文件存儲格式BMP文件頭位圖信息頭顏色表位圖信息——BITMAPINFO結構BMP位圖文件匯總按照顏色深度分類&#xff0c;常用圖像文件&…

Ubuntu18.04.4 環境下對屬性加密算法CP-ABE環境搭建

注意事項 cpabe依賴pbc&#xff0c;pbc依賴gmp&#xff0c;gmp依賴M4、bison、flex如果權限不夠 &#xff0c;命令的前面加上sudo &#xff0c;不要直接使用root用戶進行操作&#xff0c;其帶來的隱患有很多 第一步 配置簡單的環境 簡單環境 包括gcc、g、make、cmake、openss…

C語言 函數指針 int(*ptr)(int,int)

基本介紹 函數指針:指向函數的指針 與數組類似 定義 Int(*pmax)(int ,int)max; Int(*pmax)(int x,int y)max;//形參名稱不重要 函數返回類型(*指針)(形參類型)函數名稱; 具體案例 代碼: *pmax取到函數本身 調用函數指針方式: (*pmax)(x,y); pmax(x,y);//與java中調用函數一…

C++ primer 第14章 操作重載與類型轉換

文章目錄基本概念直接調用一個重載的運算符函數某些運算符不應該被重載使用與內置類型一致的含義選擇作為成員或者非成員輸入和輸出運算符重載輸出運算符<<輸出運算符盡量減少格式化操作輸入輸出運算符必須是非成員函數重載輸入運算符>>算術和關系運算符相等運算符…

C語言 回調函數 produce(arr,len,getRand)

基本介紹 回調函數:形參中包含另一個函數的函數指針 用函數指針接收另一個函數 案例 代碼解析 具體代碼 #include<stdio.h> #include<stdlib.h> //回調函數--//函數原型 int getRand(); int *produce(int*arr,int len,int(*get)()); int main() {int arr[10…

從零開始配置服務器密碼機的開發環境

開發環境環境配置安裝gcc編譯器安裝g編譯器安裝make安裝cmake安裝ssh安裝git和配置安裝大文件管理工具git-lfs安裝數據庫sqlite3安裝數據庫sqlite_orm文件安裝Openssl安裝Tcl和Tk安裝tcl-expect-dev安裝boost安裝clang-format安裝Clion注意事項安裝automake和libudev-dev環境配…

C語言 動態內存分配機制(堆區) int*p=malloc(5*sizeof(4))

C程序內存分配圖 棧區:局部變量 堆區:動態分配的數據 靜態存儲區/全局區:全局變量,靜態數據 代碼區:代碼,指令 內存分配說明 內存動態分配的相關函數 堆區: #inlcude<stdlib.h> Malloc(size);//分配長度為size個字節的連續空間 Calloc(n,size);//分配size個長度為n…

C++ primer 第15章 面向對象程序設計

文章目錄前言OOP&#xff1a;概述繼承動態綁定定義基類和派生類定義基類成員函數與繼承訪問控制與繼承定義派生類派生類中的虛函數派生類對象及派生類向基類的類型轉換派生類構造函數派生類使用基類的成員繼承與靜態成員派生類的聲明被用作基類的類防止繼承的發生類型轉換與繼承…

服務器密碼機部分文件的介紹學習

相關文件包 automake,autoconf使用詳解

C語言 結構體 struct Cat cat1;

引入 使用傳統技術解決 需要定義多個變量或數組 結構體與結構體變量的關系示意圖 類似Java類中的對象(結構體)與屬性(結構體變量) 一切物體都可以看作對象(結構體) 補充:C語言數據類型 簡單使用案例 代碼 Cat是我們自己定義的數據類型 struct Cat cat1;//創建struct Cat的…

boost Filesystem Library Version 3關于文件的一些函數封裝 fsync()函數

boost boost Filesystem Library Version 3boost::filesystem使用方法,根據路徑創建文件夾使用boost.filesystem檢查文件是否存在的正確方式std::filesystem::temp_directory_path關于C#:與boost :: filesystem :: unique_path()等效的C 17是什么?C++ 檔案、資料夾、路徑處理…

c++面向對象高級編程 總目錄

本文是對學習侯捷視頻 c面向對象高級編程系列博客的目錄總索引。 c面向對象高級編程 學習一 不帶指針的類&#xff1a; 訪問私有成員變量的方式&#xff0c;內聯inline&#xff0c;常量成員函數&#xff0c;構造函數&#xff0c;值傳遞&#xff0c;引用傳遞&#xff0c;操作符…

C語言 共用體/聯合體 union

引入 傳統技術的缺陷—結構體 共用體基本介紹 共用體與結構體一樣都是值傳遞 定義共用體的三種方式 內存布局 共用體數據空間占用最大的成員的數據空間大小 案例解析 1) 2) 3) 4) 注: 1010 1101 0101 0100所對應的十進制是負數 計算機中的二進制都是以補碼存儲的,所…

C++ Makefile文件詳解

什么是Makefile文件 一個工程&#xff0c;源文件不計其數&#xff0c;按照類型、功能、模塊分別放在對應的若干個目錄中Makefile定義了一系列的規則&#xff0c;比如定義文件編譯的先后順序。類似shell腳本&#xff0c;也可以執行操作系統的命令Makefile帶來的好處是自動化編譯…

C語言 項目練習-家庭收支軟件

目標 需求說明 界面說明 登記收入界面: 登記支出界面 收支明細界面 退出界面 項目代碼改進要求 自己完成的代碼 版本1 #include<stdio.h> #include<string.h> void choose(int button,int i); //項目--家庭收支軟件 static double total10000;//總金額 #de…

c++ fmt 庫安裝和使用示例、clion配置

安裝 git clone https://github.com/fmtlib/fmt.gitmake .mkae && make install CLion使用 使用和安裝存在出入下載源碼&#xff0c;可以先 clone 到你的項目中去&#xff0c;https://github.com/fmtlib/fmt &#xff0c;我放到的是項目的 dependencies 目錄然后在…

C語言 項目 CRM系統(客戶信息管理系統)

項目目標 項目需求說明 系統界面 1)添加客戶界面 通過編號來區分客戶 2)刪除客戶界面 對用戶輸入的編號進行核查,存在與否,合法與否 3)顯示客戶列表界面 4)修改客戶信息的界面 項目設計 Customer結構體的設計 CRM系統結構框架圖 案例代碼 #include <stdio.h>…

代碼重構 防火墻 相關知識

參考 依據Linux命令以及sysconf下現有的iptables命令&#xff0c;詳見hsm_sysconf_server/src/sysconf_server.cpp中的firewall規則。 接口名稱 firewall_manager 目的(現實) 根據網口直連獲取當前eth0和eth1的各種信息保證設置的正確性 以及要針對管理口和服務口設計不…

C語言 文件的基本介紹

基本介紹 輸入流與輸出流 重點在C程序(內存)的數據移動方向 對于C程序(內存) 輸入數據:輸入流 輸出數據:輸出流 輸入 和輸出 C標準庫 標準輸入輸出庫 標準文件 getchar()&putchar()函數 代碼 #include<stdio.h> #include<stdlib.h> //文件--getchar()和…