中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

酷炫網(wǎng)站設計風格北京做網(wǎng)站推廣

酷炫網(wǎng)站設計風格,北京做網(wǎng)站推廣,網(wǎng)站上的vR場景貼圖怎么做的,工業(yè)設計研究生院校排名💓博主CSDN主頁:杭電碼農(nóng)-NEO💓 ? ?專欄分類:C從入門到精通? ? 🚚代碼倉庫:NEO的學習日記🚚 ? 🌹關(guān)注我🫵帶你學習C ? 🔝🔝 C11 1. 前言2. 統(tǒng)一的列表初始化3. initializer…

💓博主CSDN主頁:杭電碼農(nóng)-NEO💓
?
?專欄分類:C++從入門到精通?
?
🚚代碼倉庫:NEO的學習日記🚚
?
🌹關(guān)注我🫵帶你學習C++
? 🔝🔝


在這里插入圖片描述

C++11

  • 1. 前言
  • 2. 統(tǒng)一的列表初始化
  • 3. initializer_list容器講解
  • 4. 左值與右值引用的初步認識
  • 5. 左值引用與右值引用比較
  • 6. 右值引用的使用場景以及價值
  • 7. 模板中的萬能引用:&&
  • 8. 總結(jié)以及拓展

1. 前言

在C++98過后,更新的最重大,最有意義的就是C++11,
C++11新增了很多實用的內(nèi)容,
C++11能更好地用于系統(tǒng)開發(fā)和庫開發(fā)、語法更加泛華和簡單化、更加穩(wěn)定和安全,
不僅功能更強大,而且能提升程序員的開發(fā)效率,公司實際項目開發(fā)中也用得比較多,
不僅如此,面試時也會問C++11的內(nèi)容,所以我們要作為一個重點去學習

關(guān)于C++11的小故事:

在這里插入圖片描述

本章重點:

本篇文章著重講解C++11中新增的
統(tǒng)一的列表初始化{},及其底層容器:
initializer_list.并且會著重講解C++11
中的右值引用相關(guān)內(nèi)容,關(guān)于右值引用
的內(nèi)容多并且雜,請同學們耐心學習!


2. 統(tǒng)一的列表初始化

請注意,用列表初始化和使用初始化
列表是兩個完全不一樣的概念!

不知道各位在寫代碼有沒有這樣寫過:

vector<int> vv{1,2,3,4,5,6};
vector<int> vv = {1,2,3,4,5,6};

這就是使用列表來初始化容器!

C++11擴大了用大括號括起的列表(初始化列表)的使用范圍,使其可用于所有的內(nèi)置類型和用戶自定義的類型,使用初始化列表時,可添加等號(=),也可不添加。

即使都是用列表初始化,但種類可能不同:

class Date
{
public:Date(int year, int month, int day):_year(year),_month(month),_day(day){}
private:int _year;int _month;int _day;};
int main()
{Date d1(2022, 1, 1); // old style// C++11支持的列表初始化,這里會調(diào)用構(gòu)造函數(shù)初始化Date d2{ 2022, 1, 2 };Date d3 = { 2022, 1, 3 };vector<int> v{1,2,3};return 0;
}

上面代碼中,用列表初始化Date類和
vector類是不一樣的,因為使用列表初
初始化Date時列表中的參數(shù)個數(shù)和類型
必須和Date中構(gòu)造函數(shù)的參數(shù)個數(shù)類型
匹配,你不能寫成Date d{2022}.但是在
vector初始化時,列表中的參數(shù)個數(shù)可以
是任意多個.

列表參數(shù)個數(shù)與構(gòu)造函數(shù)一樣的是隱式類型轉(zhuǎn)換

你甚至可以這樣用列表初始化:

vector<Date> vv{ {2023,12,2}, {2023,12,3}, {2023,12,4}};
map<string,int> mm{ {"西瓜",1}, {"蘋果",2}, {"香蕉",3}};

3. initializer_list容器講解

C++11中,大括號可以被識別為
一種類型,請看下面的代碼驗證:

auto it = { 1,2,3,4 };//li是initializer_list類型
cout << typeid(it).name() << endl;

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

到這里,我們就能理解為啥STL的容器
可以支持用列表初始化了,因為它的內(nèi)
部的構(gòu)造函數(shù)和operator=函數(shù)重載了
參數(shù)是initializer_list的版本,所以當外界
使用列表初始化時,內(nèi)部會識別為
initializer_list類型就會去調(diào)用特定的構(gòu)造!

隨便看看幾個容器的構(gòu)造版本:
(注意要看C++11版本的)
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

并且initializer_list的內(nèi)容不可修改
它指向的內(nèi)容在常量區(qū)


4. 左值與右值引用的初步認識

首先,要先分清左值和右值的區(qū)別
左值的概念:

左值是一個表示數(shù)據(jù)的表達式(如變量名或解引用的指針),我們可以獲取它的地址+可以對它賦值,左值可以出現(xiàn)賦值符號的左邊,右值不能出現(xiàn)在賦值符號左邊。定義時const修飾符后的左值,不能給他賦值,但是可以取它的地址。左值引用就是給左值的引用,給左值取別名

// 以下的p、b、c、*p都是左值
int* p = new int(0);
int b = 1;
const int c = 2;
// 以下幾個是對上面左值的左值引用
int*& rp = p;
int& rb = b;
const int& rc = c;
int& pvalue = *p;

右值的概念:

右值也是一個表示數(shù)據(jù)的表達式,如:字面常量、表達式返回值,函數(shù)返回值(這個不能是左值引用返回)等等,右值可以出現(xiàn)在賦值符號的右邊,但是不能出現(xiàn)出現(xiàn)在賦值符號的左邊,右值不能取地址。右值引用就是對右值的引用,給右值取別名

double x = 1.1, y = 2.2;
// 以下幾個都是常見的右值
10;
x + y;
fmin(x, y);
// 以下幾個都是對右值的右值引用
int&& rr1 = 10;
double&& rr2 = x + y;
double&& rr3 = fmin(x, y);
// 這里編譯會報錯:error C2106: “=”: 左操作數(shù)必須為左值
10 = 1;
x + y = 1;
fmin(x, y) = 1;

注意,并不能用一個值能不能修改來區(qū)分左右值
const修飾的左值也不能修改,右值引用是&&

總結(jié):

  • 區(qū)分左值和右值最常用的方法是看它
    能不能取地址,能取地址的是左值!

  • 雖然右值不能取地址,但是可以對使用
    右值引用后的變量取地址!

int&& r = 10;
int* pr = &r;

5. 左值引用與右值引用比較

先說它們兩個的結(jié)論:

  • 左值引用只能引用左值,不能引用右值
    但const左值引用能引用右值

  • 右值引用只能引用右值,不能引用左值
    但右值引用可以引用move后的左值

代碼檢驗:

// 左值引用只能引用左值,不能引用右值。
int a = 10;
int& ra1 = a;   // ra為a的別名
//int& ra2 = 10;   // 編譯失敗,因為10是右值
// const左值引用既可引用左值,也可引用右值。
const int& ra3 = 10;
const int& ra4 = a;
--------------------------------------------------
// 右值引用只能右值,不能引用左值。
int&& r1 = 10;
// error C2440: “初始化”: 無法從“int”轉(zhuǎn)換為“int &&”
// message : 無法將左值綁定到右值引用
int a = 10;
int&& r2 = a;
// 右值引用可以引用move以后的左值
int&& r3 = std::move(a);

move是標準庫中的一個函數(shù),它可以將
一個變量/對象變成"將亡值",比如說現(xiàn)在
有一個數(shù)據(jù)的存在只是為了初始化另外
一個數(shù)據(jù),那么如果不使用move的話,編譯器
會將原先的數(shù)據(jù)給目標數(shù)據(jù)拷貝一份,并且
原先的數(shù)據(jù)即使已經(jīng)沒用了也會等到出了
作用域再銷毀,加入我們使用move,編譯器就
不會將原先的數(shù)據(jù)拷貝至目標數(shù)據(jù),而是將
原先的數(shù)據(jù)直接給目標數(shù)據(jù),而原先的數(shù)據(jù)清0!

在這里插入圖片描述


6. 右值引用的使用場景以及價值

其實右值引用的價值剛剛已經(jīng)談到過了,
特別是在一些STL容器中,我們push一個
10,10是右值,此時不用拷貝直接此資源
做交換即可,或者說push了一個以后不需
要的值,也就是將亡值,此時也可以直接交換!

正因為如此,C++11的STL容器的構(gòu)造
函數(shù)和賦值函數(shù)都重載了右值版本:

在這里插入圖片描述
在這里插入圖片描述

右值版本的構(gòu)造很簡單,直接swap資源即可
不需要像左值一樣做拷貝,增加了效率!

//編譯器識別為右值,直接調(diào)用右值引用版本的構(gòu)造
string str("abcdef");
list<string> lt;
//move后編譯器識別為右值,push后原本的str就被清0了
lt.push_back(move(str));

庫中重載的右值引用版本的構(gòu)造和賦值
被稱為"移動構(gòu)造"和移動賦值",它們極大的
提高的很多場景下的效率!

并且在函數(shù)返回值問題上,右值引用也能
發(fā)揮意想不到的作用,請看下面的例子:

string to_string(int val)
{string ret;//...將整數(shù)轉(zhuǎn)換為字符串return ret;
}
string s1 = to_string(123);

如果沒有移動構(gòu)造和移動賦值,這里
return ret后會先將ret拷貝給臨時對象
然后這個臨時對象再把數(shù)據(jù)賦值給
外面的s1對象,這里要經(jīng)歷兩次拷貝
可以說效率極其低下,其過程圖如下:

在這里插入圖片描述
假如我們實現(xiàn)的移動構(gòu)造,編譯器會把
ret識別為將亡值,就會去調(diào)用移動構(gòu)造,
并且經(jīng)過編譯器的優(yōu)化后,這兩步拷貝
構(gòu)造最終會被優(yōu)化為一步移動賦值!

在這里插入圖片描述


7. 模板中的萬能引用:&&

模板中的&&不代表右值引用,而是萬能引用,其既能接收左值又能接收右值,模板的萬能引用只是提供了能夠接收同時接收左值引用和右值引用的能力

請看下面的代碼:

void Fun(int &x){ cout << "左值引用" << endl; }
void Fun(const int &x){ cout << "const 左值引用" << endl; }
void Fun(int &&x){ cout << "右值引用" << endl; }
void Fun(const int &&x){ cout << "const 右值引用" << endl; }template<class T>
void PerfectForward(T&& t)//萬能引用
{Fun(t);
}
int main()
{PerfectForward(10);//右值           int a;PerfectForward(a);//左值            PerfectForward(std::move(a));//右值const int b = 8;PerfectForward(b);//左值PerfectForward(std::move(b));//右值 return 0;
}

第一層per函數(shù)的參數(shù)既能接受左值
也能接受右值,但是假如你把代碼復制
后測試,會發(fā)現(xiàn)在參數(shù)傳遞到第二層函數(shù)
時,它全部變成的左值,這是因為模板中的
萬能引用會將右值退化成左值,所以后續(xù)
使用過程它就變成了左值!

使用forward可以保留對象的原生類型

void PerfectForward(T&& t)
{Fun(std::forward<T>(t));
}

注意,如果有多層調(diào)用,那么每一層都要加forward


8. 總結(jié)以及拓展

C++11之后,類的六個默認成員函數(shù)
又增加了兩個,移動構(gòu)造和移動賦值,
對于這兩個函數(shù)需要注意下面幾個點:

在這里插入圖片描述

文章內(nèi)容已經(jīng)完結(jié),有問題歡迎私信


🔎 下期預告:lambda表達式和包裝器🔍
http://www.risenshineclean.com/news/54027.html

相關(guān)文章:

  • 網(wǎng)站建設這個工作怎么樣天津建站網(wǎng)
  • 公司網(wǎng)站建設方案詳細方案軟文推廣產(chǎn)品
  • 北京網(wǎng)站開發(fā)網(wǎng)站開發(fā)公司seo網(wǎng)站優(yōu)化培訓找哪些
  • 通遼做家教的網(wǎng)站seo營銷優(yōu)化
  • 貼吧廣告投放seo前線
  • 武漢網(wǎng)站建設 網(wǎng)站制作市場營銷的策劃方案
  • 做外包的網(wǎng)站有哪些優(yōu)化大師官方下載
  • 高端定制網(wǎng)站開發(fā)網(wǎng)站模板設計關(guān)鍵詞搜索愛站網(wǎng)
  • seo 服務如何優(yōu)化網(wǎng)站
  • 高校后勤網(wǎng)站建設要求二級域名和一級域名優(yōu)化難度
  • 網(wǎng)站建設資料準備標準江西seo推廣軟件
  • 網(wǎng)站建設免湖南seo網(wǎng)站開發(fā)
  • 設計公司網(wǎng)站建設2022年最近十大新聞
  • 唐山房產(chǎn)網(wǎng)站建設東莞網(wǎng)絡推廣平臺
  • 微信網(wǎng)站建設公司衡水seo優(yōu)化
  • 怎么做彩票網(wǎng)站seol英文啥意思
  • 棗莊網(wǎng)站設計怎么有自己的網(wǎng)站
  • 三亞高端服務網(wǎng)站輕松seo優(yōu)化排名 快排
  • 企業(yè)做網(wǎng)站建設鎮(zhèn)江網(wǎng)站建設
  • 廣州市網(wǎng)站建設制作設計平臺廣州今天新聞
  • 蘄春做網(wǎng)站google瀏覽器入口
  • b2b貿(mào)易網(wǎng)站公司推廣渠道
  • 硬盤做網(wǎng)站空間漢中seo培訓
  • 武漢網(wǎng)站建設哪家好電腦培訓班附近有嗎
  • pcb設備網(wǎng)站怎么做適合seo軟件
  • 鄭州高端建站公司中國搜索引擎有哪些
  • 如何建立新聞網(wǎng)站搜索引擎bing
  • 西安php網(wǎng)站開發(fā)培訓班信息流廣告哪個平臺好
  • 網(wǎng)站制作技巧南京百度快速排名優(yōu)化
  • 網(wǎng)站開發(fā)服務流程廣州seo網(wǎng)絡營銷培訓