簡體   English   中英

關於轉換構造函數和賦值運算符

[英]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) )。

這是基本的重載決議 兩種重載都是可行的:

  1. 57綁定到foo::operator=(int) (完全匹配)

  2. 通過轉換構造函數將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.

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