почему здесь не вызывается оператор присваивания? - PullRequest
0 голосов
/ 29 августа 2011

Редактировать: извините, я использовал «конструктор присваивания» вместо «оператор присваивания» в моем исходном посте. Исправлено сейчас.

Оказывается, что конструктор копирования вызывается вместо оператора присваивания в следующем коде. Кто-нибудь может сказать мне причину этого? Спасибо.

class A

{
int i;
public:
A(int ii) { i = ii; }
A(const A& a) { i = a.i; i++; }
A& operator=(const A& a) { i = a.i; i--; }
};
int main(void)
{
A a(4);
A b = a;
return 0;
}

Ответы [ 2 ]

7 голосов
/ 29 августа 2011
A a(4);
A b = a;

Ни одно из них не является заданием 1 . Оба являются инициализацией.

Первый называется прямой инициализацией, а второй называется копированием-инициализацией.

Разница между ними заключается в том, что первый из них будет работать, даже если конструктор копирования недоступен (т. Е. Либо private или protected), а второй НЕ будет работать, если конструктор копирования недоступен.

Несмотря на то, что второй требует, чтобы конструктор копирования был доступен, это не означает, что конструктор копирования обязательно будет вызван. Компилятору разрешено оптимизировать это, и поэтому он может полностью исключить вызов конструктора копирования. Для семантической проверки необходим доступный конструктор копирования.

Смотрите эти темы:

1. И нет ничего такого, что называется «конструктор присваивания» .

4 голосов
/ 29 августа 2011

operator= не является «конструктором присваивания», это «оператор присваивания».

Когда вы инициализируете переменную в ее определении (как в A b = a), она по определению эквивалентнавызывая конструктор копирования.то есть A b(a); и A b = a; в точности эквивалентны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...