Бьерн Страуструп.
Язык программирования С++
192
значения s, для этого надо вызвать конструктор копирования для string. Для получения еще одной копии
значения s по выходе из g() нужен еще один вызов конструктора string(const string&). На этот раз
инициализируется временная переменная, которая затем присваивается s. Для оптимизации одну, но
не обе, из подобных операций копирования можно убрать. Естественно, временные переменные,
используемые для таких целей, уничтожаются надлежащим образом деструктором string::~string() (см.
$$R.12.2).
Если в классе X операция присваивания X::operator=(const X&) и конструктор копирования X::X(const X&)
явно не заданы программистом, недостающие операции будут созданы транслятором. Эти созданные
функции будут копировать по членам для всех членов класса X. Если члены принимают простые
значения, как в случае комплексных чисел, это, то, что нужно, и созданные функции превратятся в
простое и оптимальное поразрядное копирование. Если для самих членов определены
пользовательские операции копирования, они и будут вызываться соответствующим образом:
class Record {
string name, address, profession;
//
...
};
void f(Record& r1)
{
Record r2 = r1;
}
Здесь для копирования каждого члена типа string из объекта r1 будет вызываться string::operator=(const
string&). В нашем первом и неполноценном варианте строковый класс имеет член-указатель и
деструктор. Поэтому стандартное копирование по членам для него почти наверняка неверно.
Транслятор может предупреждать о таких ситуациях.
Достарыңызбен бөлісу: