目錄
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不可忽略。執行拷貝...