c++類成員變數為什麼不能做成員函數的默認實參?

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之間的區別?
什麼樣的編程語言會不支持遞歸呢?
模板類未實例化時,為什麼編譯器會漏檢一些錯誤?

TAG:編程語言 | 編程 | CC | C11 |