中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

總結C++11中decltype、類內初始化、列表初始化返回值

發布時間:2020-07-22 14:17:30 來源:億速云 閱讀:445 作者:小豬 欄目:編程語言

小編這次要給大家分享的是總結C++11中decltype、類內初始化、列表初始化返回值,文章內容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

作用:返回表達式或變量的類型

返回值規則:

  • 若e是一個左值(lvalue,即“可尋址值”),則decltype(e)將返回T&
  • 若e是一個臨終值(xvalue),則返回值為T&&
  • 若e是一個純右值(prvalue),則返回值為T

decltype()不會執行括號內的表達式,decltype返回的類型是用于聲明的,不能用于單純的判斷。比如decltype(a)==int,是不可以的,只能是在定義新的變量、返回值的地方使用:

int a=1;
decltype(a) b (等價于int b)

若是給變量加多了1個括號,則會成為一個表達式。

int a = 1;
int b=2;
decltype((a)) d=b // decltype((a)) 
返回類型int&。而引用必須賦初值,所以這里的d必須賦初值。

若表達式和指針相關的用法:

設p是指向int變量的指針

  1. decltype(*p)-》返回int& 即引用
  2. decltype(p)-》返回int* 即指針
  3. decltype(&p)-》返回int** 即指針的指針。

這里解釋一下為什么1返回的是引用而不是int:因為*p返回的本質上就是一個引用,當我們向*p賦值的時候,改變的是變量原本的值,而不是做了一個拷貝,顯然這是引用的性質。

泛型編程中使用decltype:

通過和尾置返回類型結合,可以使得返回值可以由編譯器推斷,無需程序員指出。主要用于編寫轉發函數

int& foo(int& i);
float foo(float& f);

template <class T> 
auto transparent_forwarder(T& t) &#8722;> decltype(foo(t)) 
{
 return foo(t);
}

像這個例子如果沒有decltype,我們無法確定foo(t)到底是兩個備選函數中的哪一個,因為這是在運行時決定的。這樣子我們無法直接編寫transparent_forwarder函數的返回值。

還有其他很多例子,decltype常用于難以確定變量類型的地方,而模板就是為了適配多類型而產生的,所以在泛型編程中,很多時候都會用到decltype來做到靈活定義變量類型。

類內初始化

C++11以前是不可以在一個類的數據成員聲明的時候初始化的,除非是一個const的靜態變量:

class A
{
 static int i = 1; //correct,不得不在此賦值,因為const常量必須在聲明時賦值
 int num=2; //error,不允許在類內聲明的時候對數據成員初始化
};

這樣子帶來繁瑣的問題就是:盡管我們只是想為所有該類的實例的數據成員都設置一個初始值,也必須自己定義一個構造函數才能做到。

于是在c++11:允許直接在類內初始化值(前提:這個值必須是常量表達式)。

順序:類內部初始化先于構造函數初始化進行,構造函數初始化會覆蓋類內部初始化。也就是說,如果我們即定義了類內初始化值,又定義了自己的構造函數,最終的結果還是按照我們的意愿,對數據成員按照構造函數賦值。

使用方法:

class A
{
 int num=2; //correct,C++11允許在類內聲明的時候對數據成員初始化
 int a{7} //用花括號賦值也可以,a=7 
};

注意:C++11中,仍然沒有改變靜態數據成員必須在類內聲明,類外初始化的事實。

class A
{
 static int d = 1; //error
};
int A::d = 1 //correct,一般來說:初始化語句會放在cpp文件,類定義放在h文件

列表初始化返回值

在C++11之前,如果我們想要返回一組數據,我們必須在子函數中構造一個對應的容器,借助容器來進行返回。

vector<int> process()
{
 vector<int> v={1,2,3,4}
 return v;
}

在新標準下,我們可以直接返回字面值,該字面值會用于容器的構造,而無需我們自己去構造。

vector<int> process()
{
 return {1,2,3,4};
}

看完這篇關于總結C++11中decltype、類內初始化、列表初始化返回值的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

仪陇县| 嘉义县| 百色市| 焦作市| 宁城县| 岳阳县| 大冶市| 重庆市| 克东县| 安国市| 金塔县| 郓城县| 金坛市| 望都县| 清远市| 海宁市| 剑川县| 老河口市| 巨鹿县| 广安市| 开封县| 兴文县| 邢台市| 顺昌县| 平江县| 新泰市| 武穴市| 廉江市| 余江县| 葫芦岛市| 漠河县| 通河县| 崇文区| 峨边| 梧州市| 正阳县| 万年县| 伊金霍洛旗| 化德县| 河北区| 崇仁县|