免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
C++定義類的關(guān)鍵字——constexpr

  constexpr用于在C++11中申報(bào)常量表達(dá)式(constexpression),可用于函數(shù)返回值、函數(shù)參數(shù)、數(shù)據(jù)申報(bào)和類結(jié)構(gòu)函數(shù)。

  常量表達(dá)式指數(shù)不會改變,在編譯期間得到計(jì)算結(jié)果,例如:

  const int i=3;    //i是一個常變量
  const int j=i+1;  //j是一個常變量,i+1是一個常量表達(dá)式
  int k=23;         //k的值可以改變,從而不是一個常變量
  const int m=f();  //m不是常變量,m的值只有在運(yùn)行時才會獲取1234復(fù)制代碼類型:[cpp]

  1、constexpr的應(yīng)用。

  1)常量表達(dá)函數(shù)。

  若能在編譯過程中確定函數(shù)返回值,則可使用constexpr修改函數(shù)返回值,使函數(shù)成為常量表達(dá)式函數(shù)。

constexpr int f(){return 1;}1復(fù)制代碼類型:[cpp]

  請注意,constexpr修改函數(shù)的返回值需要滿足以下條件:

  (a)函數(shù)必須有返回值;

  (b)函數(shù)體只有單一的return語句;

  (c)return語句中的表達(dá)式也必須是常量表達(dá)式;

  使用前必須對函數(shù)進(jìn)行定義。

  2)常量表達(dá)式值。

  一般而言,如果確定變量為常量表達(dá)式,則聲明為constexpr類型。

constexpr int i=3;	//i是一個常變量constexpr int j=i+1;	//i+1是一個常變量constexpr int k=f(); 	//只有f()是一個constexpr函數(shù)時,k才是一個常量表達(dá)式123復(fù)制代碼類型:[cpp]

  必須明確的是,在constexpr聲明中,如果定義了指針,constexpr只對指針有效,與指針?biāo)傅膶ο鬅o關(guān)。

const int *p=nullptr;  		//p是一個指向整型常量的指針(pointer to const)constexpr int *p1=nullptr;	//p1是一個常量指針(const pointer)12復(fù)制代碼類型:[cpp]

  若自定義類型對象為常量表達(dá)式,則在定義自定義類型時,需要將constexpr作用于自定義類型的構(gòu)造函數(shù)。

  struct MyType {
	int i;	constexpr MyType(int x):i(x){}
  };  constexpr MyType myType(1);12345復(fù)制代碼類型:[cpp]

  作用于自定義類型的constexpr結(jié)構(gòu)函數(shù)需要滿足以下條件:

  (a)構(gòu)造函數(shù)體必須為空;

  (b)初始化列表只能使用常量表達(dá)式。

  3)其他常量表達(dá)式應(yīng)用。

  (a)常量表達(dá)式作用于函數(shù)模板。

  常量表達(dá)式可以作用于函數(shù)模板,但由于函數(shù)模板參數(shù)的不確定性,實(shí)例化模板函數(shù)可能不符合常量表達(dá)式的條件。此時,C++11標(biāo)準(zhǔn)自動忽略constexpr。

  struct NotConstType {
	int i;
	NotConstType(int x) :i(x) {}
  };
  NotConstType myType;  //constexpr作用于函數(shù)模板
  template <typename T> constexpr T ConstExpFunc(T t) {	return t;
  }  int main(){
	NotConstType objTmp = ConstExpFunc(myType);	//編譯通過,ConstExpFunc實(shí)例化為普通函數(shù),constexpr被忽略
	constexpr NotConstType objTmp1 = ConstExpFunc(myType);	//編譯**失敗**
	constexpr int a = ConstExpFunc(1);	//編譯通過,ConstExpFunc實(shí)例化為常量表達(dá)式函數(shù)
  }12345678910111213141516復(fù)制代碼類型:[cpp]

  (b)constexpr元編程。

  constexpr可以作用于遞歸函數(shù),實(shí)現(xiàn)編譯時期的數(shù)值計(jì)算,即constexpr元編程。根據(jù)C++11標(biāo)準(zhǔn),常量表達(dá)式應(yīng)至少支持512層遞歸。

  constexpr int Fibonacci(int n){	return (n == 1) ? 1 : (n == 2 ? 1 : Fibonacci(n - 1) + Fibonacci(n - 2));
  }  int main(){	constexpr int fib8 = Fibonacci(8);	//編譯期常量等于21
  }1234567復(fù)制代碼類型:[cpp]

  請注意,constexpr元編程并非C++11標(biāo)準(zhǔn)強(qiáng)制編譯器必須實(shí)現(xiàn),編譯器可以有選擇地實(shí)現(xiàn)。換句話說,編譯器可能不支持遞歸常量表達(dá)式函數(shù)。但也不用太擔(dān)心,主流C++編譯器都是支持的,比如GCC和VC++。

  2、constexpr和const的區(qū)別。

  const可以修改函數(shù)參數(shù)。函數(shù)返回值。函數(shù)本身。類const在不同的使用場景中有不同的含義,但在大多數(shù)情況下,const描述的是運(yùn)行時常量性,即數(shù)據(jù)在運(yùn)行過程中是不可改變的。

  constexpr可以修改函數(shù)參數(shù)、函數(shù)返回值、變量、類結(jié)構(gòu)函數(shù)、函數(shù)模板等。,這是一種比const更嚴(yán)格的約束。它修改的表達(dá)式不僅具有運(yùn)行時常量,還具有編譯時常量,即constexpr修改的表達(dá)式值可以在編譯過程中知道。我們來看看實(shí)際應(yīng)用的區(qū)別:

  const int getConst(){ return 1; }  enum{ e1=getConst(),e2};				//編譯出錯

  //換成constexpr即可在編譯期確定函數(shù)返回值用于初始化enum常量
  constexpr int getConst(){ return 1; }  enum{ e1=getConst(),e2};				//編譯OK123456復(fù)制代碼類型:[cpp]

  在constexpr出現(xiàn)之前,可以在編譯期初始化的const表達(dá)式是隱含的常量表達(dá)式(implicitconstexpr),直到c++11、constexpr才從const中細(xì)分為關(guān)鍵詞。

  const自1983年C++剛改名以來就存在。面對constexpr,我們應(yīng)該盡可能合理地使用constexpr來幫助編譯器優(yōu)化代碼。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
深入淺出C++11(4)
C :const
深入探索C++20的重要特性:從模塊化到協(xié)程
C 總結(jié):C 中的const和constexpr
《C++ Primer》筆記 第2章 變量和基本類型
C /C之換個姿勢看常量
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服