詳解C 中的const和constexpr

2022-09-21 08:42:10 字數 2074 閱讀 9831

目錄

const int a = 10; 表示int物件a,是乙個常量,不可以改變值,從編譯器生成二進位制角度看,生成的a存放在.rodata段,也就是唯讀(readonly)區域。不過並不絕對,有的時間統計優化等級開的高,也不取位址,可能會優化成立即數在.text段中。

class caaa

const int getvalue() const

void addvalueonetime()

private:

const int m_iv;

public:

mutable int m_ichangev;

static const int m_istaticv;

};static const int m_istaticv = 1000;

const caaa aa(100);

aa.g

aa.m_ichangev++;

const char* p1;

char const *p2;

char* const p3;

const char* const p4;

對於初學者來說這大概是很難理解的乙個知識點,怎麼區分這四個呢?記住秘訣,直接從右向左讀就一招制敵了。

float dvalue = 1.05f;

const int& a = dvalue;

const int itemp = dvalue;

const int& a = itemp;

template

struct removeconst;

template www.cppcns.com

struct removeconst;

template

using rctype = typename removeconst::type;

const char* pa = "sss";

char* pb = const_cast(pa);

auto pc = rctype(pa);

std::cout << "type is the same: " << std::is_same::value << std::endl;

std::cout << "pb type name: " << typeid(pb).name() << "pc type name: " << typeid(pc).name() << std::endl;

//pb[0] = 'a';//error, segmentation fault

const int isize1 = sizeof(int);

const int isize2 = getsize();

isize1是個常量,編譯期的,但isize2就不一定,它雖然不能改變,但要到getsize()執行結束,才能知道具體值,這與常量一般在編譯期就知道的思想不符,解決這個問題的方法就是改為:constexpr int isize2 = getsize();這樣要求getsize()一定要能在編譯期就算出值,下面幾個例子中getsizeerror()就會編譯失敗。getfibo函式,編譯期就已經遞迴計算出值。

constexpr int getsize()

constexpr int getsizeerror()

constexpr int getcalc(int n)

const int isize1 = sizeof(int);

constexpr int isize2 = getsize();

//constexpr int isize3() = getsizeerror();

constexpr int isize4 =

std::cout << isize1 << " " << isize2 << " " << isize4 <<:endl>

當然我們可以用模板寫getcalc函式:

template

struct tcalc;

template <>

struct tcalc<1>;

std::cout << tcalc<10>::ivalue << std::endl;

本文標題: 詳解c++中的const和constexpr

本文位址:

C 中的 const 詳解

在使用 define時,比如 define max 10000,如果出現錯誤,編譯器並不會提示max,因為在預處理階段已經把max替換成了10000,因此編譯器會莫名其妙的提示10000這個數字出現了錯誤,從而不利於程式debug,但是如果使用const int max 10000,編譯器就會準確的...

C 中的 const 詳解

在使用 define時,比如 define max 10000,如果出現錯誤,編譯器並不會提示max,因為在預處理階段已經把max替換成了10000,因此編譯器會莫名其妙的提示10000這個數字出現了錯誤,從而不利於程式debug,但是如果使用const int max 10000,編譯器就會準確的...

C 頂層const和底層const詳解

頂層const 用來標明乙個變數其本身是乙個不可更改的常量 底層const 用來標明乙個指標或引用所指向的物件是乙個不可更改常量 執行拷貝操作時,頂層const對於拷貝操作無影響 const int i 1 int m i i具有頂層const對於拷貝操作無影響。但是底層const不可忽略。執行拷貝...