Конструктор присвоений C ++ - PullRequest
3 голосов
/ 08 января 2012

Если у меня есть два класса A и B, и я делаю A = B, какой конструктор присваивания называется? Тот из класса A или тот из класса B?

Ответы [ 2 ]

6 голосов
/ 08 января 2012

Есть конструктор копирования и есть оператор присваивания. Поскольку A != B, будет вызван оператор присвоения копии.

Краткий ответ: operator = из класса A, поскольку вы назначаетесь в класс A.

Длинный ответ:

A=B не будет работать, поскольку A и B являются типами классов.

Вы, вероятно, имеете в виду:

A a;
B b;
a = b;

В этом случае будет вызываться operator = для class A.

class A
{
/*...*/
   A& operator = (const B& b);
};

Конструктор преобразования будет вызван для следующего случая:

B b;
A a(b);

//or

B b;
A a = b; //note that conversion constructor will be called here

где A определяется как:

class A
{
/*...*/
    A(const B& b); //conversion constructor
};

Обратите внимание, что это вводит неявное приведение между B и A. Если вы не хотите этого, вы можете объявить конструктор преобразования как explicit.

0 голосов
/ 08 января 2012
class abc
{
public:
  abc();

  ~abc();

  abc& operator=(const abc& rhs)
  {
    if(&rhs == this) {
      // do never forget this if clause
      return *this; 
    }
    // add copy code here
  }

  abc(const abc& rhs)
  {
    // add copy code here
  }

};

Abc a, b;
a = b; // rhs = right hand side = b

Таким образом, оператор вызывается для объекта с левой стороны. Но убедитесь, что вы не пропустите условие if.

...