[英]About conversion constructor and assignment operator
如何通過foo(int)
(轉換構造函數)和foo::operator=(int)
(重載賦值運算符)來完成foo = int
這樣的操作? 當一個人被召喚而不是其他人(也許一個是基本的)?
#include <iostream>
class foo
{
public:
foo(){}
foo(int r_value)
{
std::cout << "\nfoo::foo(int)\n";
}
void operator=(int r_value)
{
std::cout << "\nfoo::operator=(int)\n";
}
};
int main()
{
foo f;
f = 57;
return 0;
}
上面的代碼使operator=(int)
在存在時運行,如果operator=(int)
被注釋(或相反),則運行foo(int)
)。
這是基本的重載決議 。 兩種重載都是可行的:
將57
綁定到foo::operator=(int)
(完全匹配)
通過轉換構造函數將57
隱式轉換為foo
,並將臨時foo
對象綁定到隱式定義的foo::operator=(foo const &)
。
由於后者需要比前者更多的轉換,因此它是一個不太好的匹配,並且選擇前一個過載。
您仍然可以通過明確表達來實現第二個調用:
f = foo(57); // binds perfectly to foo::operator=(foo const &)
重載決策的全套規則相當長且涉及,但在這樣的個別情況下,答案是直截了當的。 不過,請參閱13.3([over.match])了解完整的血腥細節。
它們是有區別的:
foo a = 10;
調用foo::foo(int)
foo a;
a = 10;
在a
調用foo::operator=(int)
兩種實現都不同。 第一個是構造函數,第二個是賦值。 用例會有所不同,根據用例會相應調用每個用例。
用例
構造函數名為foo::foo(int)
foo f = 57;
賦值被稱為foo::operator=(int)
foo f;
f = 57;
注意
在上面的用例和示例中使用賦值有更多的開銷,因為它調用默認構造函數和賦值。
對於這個聲明
f = 57;
編譯器首先考慮所有函數operator =。 有兩個這樣的函數:由您明確定義的函數和由編譯器隱式定義的復制賦值運算符。 第一個是最合適的功能。 所以它被稱為。
如果您將對此賦值運算符進行注釋,則編譯器只有一個函數operator =。 它是隱式定義的復制賦值運算符。 但它無法直接應用。 因此編譯器尋求一種方法將提供的參數轉換為foo類型。 它可以通過調用轉換構造函數來完成此操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.