![](/img/trans.png)
[英]Using a class variable as a default argument to the class member function
[英]Using a class member as a default argument for a member function
除了手動重載相應的成員函數並以成員為參數調用第一個重載之外,還有其他方法嗎?
我正在嘗試類似的東西
class test
{
string t1="test";
testfun( string& val = this->t1 )
{ /* modify val somehow */ }
};
(測試一下: http : //goo.gl/36p4CF )
目前我想沒有技術原因為什么這不可行。
[dcl.fct.default]/8:
關鍵字
this
不應在成員函數的默認參數中使用。
這是一般問題的特例:您不能在參數的默認參數中引用其他參數。 IE
void f(int a, int b = a) {}
是畸形的。 所以會
class A
{
int j;
};
void f(A* this, int i = this->j) {}
這基本上是編譯器將void f(int i = j) {}
形式的成員函數轉換為的內容。 這源於函數參數和后綴表達式(構成對象參數)的計算順序未指定的事實。 [dcl.fct.default]/9:
每次調用函數時都會評估默認參數。 函數參數的計算順序未指定。 因此,函數的參數不應在默認參數中使用,即使它們沒有被求值。
除了重載和手動設置參數之外,是否有其他解決方案?
不,如果您希望默認參數依賴於另一個參數(包括this
,則需要重載。 雖然在這種情況下,它沒有意義,因為這是一個構造函數,並且t1
在它被調用之前不存在。
為什么這不起作用,是否有技術原因?
因為未指定函數參數的求值順序。 要在默認參數中允許參數值,您需要更復雜的規則來確保每個參數在使用之前都已初始化。
你還沒有說出你想要達到的目標。 我假設您需要每個實例都以特定方式做出反應,具體取決於某個類變量。
但是,如果您不需要每個實例的行為,那么您可以使用靜態變量。 以下工作:
#include <iostream>
using namespace std;
struct test {
static string t1;
void say(const string &val=t1){
cout << val << "!" << endl;
}
};
string test::t1;
int main() {
cout << "Hello World" << endl;
test::t1 = string("asd");
test a;
a.say();
a.say("bla");
test::t1 = string("blahblah");
a.say();
return 0;
}
...這意味着類test
所有對象都將使用靜態字符串t1
作為它們的默認值。
您可以稍微“破解”一下,並將其用作丑陋的哨兵:
void say(const string &val=t1){
if (&val == &t1) {
// They are using the default value, so act as you want
} else {
// they are providing a value
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.