c++類成員變數為什麼不能做成員函數的默認實參?
01-05
class TestClass
{
public:
TestClass() = default;
~TestClass() = default;public:
int func(int j = i)
{
cout &<&< i &<&< endl; } private: int i = 1; }; 為什麼換成類靜態變數就可以?
成員都有一個隱藏的this,參數首先需要構造才能傳遞,那時哪有this。你能開著自己將要買的汽車去買汽車嗎。
Default arguments
節選:
對於 @vczh 的答案的」為什麼「的補充:
編譯器對Default argument的解釋和翻譯是在編譯鏈接期,而非運行時。因此,作為default argument的對象要麼是一個常量,要麼有一個在編譯期就能夠確定的地址,比如靜態變數。而this指針及其成員的地址在編譯期還不確定,所以不行。類內靜態變數保證在函數解析之前,已經存在。而非靜態變數是生成對象的時候才申請的,所以不能保證在解析函數時,該變數已經準備好~就像「不知道什麼時候有資產,我就是要抵押一樣,沒這個規矩啊」~←_←
class a {
public:
void fun();
int i;
};
int main () {
a * test = NULL;
test-&>fun();
test-&>i;
}
test-&>fun() 是不會報錯的 test-&>i 是會報錯的 把i換成靜態的也不報錯。
成員函數以及靜態成員都存在於編譯後的模塊里(分別是代碼段和數據段)。而非靜態的成員變數是要等運行後分配的。可以用函數重載呀
推薦閱讀:
※VR 時代的主流編程語言是什麼?
※C++/C/JAVA/Python之間的區別?
※什麼樣的編程語言會不支持遞歸呢?
※模板類未實例化時,為什麼編譯器會漏檢一些錯誤?