簡體   English   中英

在函數聲明中使用“ this”(作為默認參數)

[英]Use “this” in a function declaration (as a default parameter)

我可以使用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類組成時,隨機顏色將被繪制為該對象的背景(除非您傳遞其他顏色)。

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

關鍵字this不能在成員函數的默認參數中使用。

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

我相信該規則是有道理的,因為默認參數的初始化發生在調用方而不是被調用方的上下文中。 (在調用者的上下文中,可能沒有this ,或者可能是另一個對象,這可能引起混亂。)

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

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

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

我假設類中也有可變的顏色,否則一切都沒有意義。

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

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

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

關鍵字this不能在成員函數的默認參數中使用。 [示例:

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

—結束示例]

無論如何,由於[dcl.fct.default] / p9所說的沒關系:

同樣,非靜態成員也不得在默認參數中使用,即使未進行評估,除非它顯示為類成員訪問表達式(5.2.5)的id表達式 ,或者除非它用於形成指向成員(5.3.1)的指針。 [示例:在以下示例中, X::mem1()的聲明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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM