日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

[C++11]常量表达式函数

發布時間:2023/12/4 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [C++11]常量表达式函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

constexpr修飾函數。

普通函數/類成員函數。

1.函數必須要有返回值,并且return返回的表達式必須是常量表達式。

代碼如下:

#include <iostream> using namespace std;//error 不是常量表達式函數 constexpr void func1() {int a = 200;cout << a << endl; }//error 不是常量表達式函數 因為a是變量,不是常量 constexpr int func2() {int a = 100;return a; }

2.函數在使用之前,必須有對應的定義語句。

代碼如下:

#include <iostream> using namespace std;constexpr int func1();int main() {constexpr int num = func1(); //errorreturn 0; }constexpr int func1() {constexpr int a = 100;return a; }

在測試程序constexpr int a = func1();中,還沒有定義func1()就直接調用了,應該將func1()函數的定義放到main函數的上邊。

3.整個函數的函數體中,不能出現非常量表達式之外的語句(using 指令,typedef 語句以及static_assert斷言,return語句除外)

代碼如下:

#include <iostream> using namespace std;//error constexpr int func1() {constexpr int a = 100;constexpr int b = 10;for (int i = 0; i < b; i++){cout << "i = " << i << endl;}return a + b; }//ok constexpr int func2() {using myType = int;constexpr myType a = 100;constexpr myType b = 10;constexpr myType c = a * b;return c - (a + b); }

因為func1()是一個常量表達式函數,在函數體內部是不允許出現非常量表達式以外的操作,因此函數體內部的for循環是一個非法操作。

代碼如下:

#include <iostream> using namespace std;//OK class Test { public:constexpr int func(){constexpr int var = 100;return 5 * var;} };int main() {Test t;constexpr int num = t.func();cout << "num = " << num << endl;return 0; }

模板函數。

C++11語法中,constexpr可以修飾模板函數,但由于模板中類型的不確定性,因此模板函數實例化后的函數是否符合常量表達式函數的要求也是不確定的。
如果constexpr修飾的模板函數實例化結果不滿足常量表達式函數的要求,則constexpr會被自動忽略,即該函數就等同于一個普通函數。

代碼如下:

#include <iostream> using namespace std;struct Person {const char *name;int age; };template <typename T> constexpr T display(T t) {return t; }int main() {Person p{ "Tom",18 };Person ret = display(p);//非常量表達式 普通函數cout << "name = " << ret.name << " age = " << ret.age << endl;constexpr Person p1{ "Jack",19 };constexpr Person ret1 = display(p1);//常量表達式函數cout << "name = " << ret1.name << " age = " << ret1.age << endl;constexpr int ret2 = display(250);//常量表達式函數cout << ret2 << endl;return 0; }

測試結果:

類的構造函數。

如果想用直接得到一個常量對象,也可以用constexpr修飾一個構造函數,這樣就可以得到一個常量構造函數。

常量構造函數要求:
構造函數的函數體必須為空,并且用初始化列表的方式為各個成員賦值。

代碼如下:

#include <iostream> using namespace std;//error /*struct Person {Person(const char *name, int age) :name(name), age(age) {}const char *name;int age; };*/struct Person {constexpr Person(const char *name,int age):name(name),age(age){}const char *name;int age; };int main() {constexpr Person p("Tom", 18);cout << "name = " << p.name << " age = " << p.age << endl;return 0; }

測試結果:

總結

以上是生活随笔為你收集整理的[C++11]常量表达式函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。