2015-01-06 69 views
1

我可以在函數聲明(類的一部分)中使用this來指定默認參數嗎?在函數聲明中使用「this」(作爲默認參數)

實施例:

class Object { 

    Object::Object(){ 
     this->color = rand(); //let's pretend that rand() will generate a random integer and that fillBg can draw a color given an integer. 
    } 

    Object::fillBg(int color = this->color){ 
     //do stuff 
    } 

} 

...所以當一個對象是由這個類Object的,隨機顏色將被繪爲對象的背景(除非你通過另一種顏色)。

+4

你爲什麼不試試看? – Ashalynd

+0

@Ashalynd已經做到了,它說我不能像這樣使用「this」,所以我在這裏只是想問一下,如果我不能像這樣以任何方式使用它,或者如果有一些黑暗的黑客我可以使用。 – alexandernst

+0

將默認參數設置爲-1,然後檢查方法主體中的「if(color == -1)color = this-> color」是什麼問題? – i486

回答

7

不,你不能。該標準明確禁止:

關鍵字this不得用於成員函數的默認參數。

(C++ 11,[dcl.fct.default]/7)

相信這個規則是有道理的,因爲默認參數初始化發生在呼叫者,而不是被叫方的上下文。 (並且在呼叫者的情況下,可能不存在諸如this之類的東西,或者它可能是不同的對象,這可能導致混淆。)

一種可能的解決方案就是過載。

Object::fillBg(int color) { 
    // ... 
} 

Object::fillBg() { 
    fillBg(this->color); 
} 
+0

爲什麼不只是說默認參數在被調用的上下文中進行評估?它會破壞什麼?或者換句話說,爲什麼它沒有意義? – Deduplicator

+1

@Deduplicator與其他論點的一致性,我認爲。 「每個參數的初始化和銷燬​​發生在 調用函數的上下文中。」 ([expr.call]/4) – Brian

6

我假設班上也有變色,否則一切都沒有意義。

答案是否定的,這是不可能的。但你可以使用

Object::fillBg() 
{ 
    fillBg(this->color); 
} 
Object::fillBg(int color) 
{ 
    //use color 
} 
+0

@IdeaHat感謝您的改進:) – deviantfan

2

不,這是不允許的。 [dcl.fct.default]/p8

關鍵字不應該用在成員函數的默認參數中。 [實施例:

class A { 
    void f(A* p = this) { } // error 
}; 

- 端示例]

無論如何,它不會因爲什麼[dcl.fct.default]/P9說物質:

類似地,非靜態成員不應在默認參數中使用,即使它不是被評估的,除非它出現在類成員訪問表達式(5.2.5)的或除非它用於形成指向成員的指針(5.3.1)。 [例如:以下示例中X::mem1()的聲明是不合格的,因爲沒有對象用作用作初始化程序的非靜態成員X::a

int b; 
class X { 
    int a; 
    int mem1(int i = a); // error: non-static member a 
    // used as default argument 
    int mem2(int i = b); // OK; use X::b 
    static int b; 
}; 

X::mem2()的聲明是有意義的,然而,由於不需要對象來訪問靜態成員X::b