|
Программирование >> Аргументация конструирования
Если потребуется выполнить преобразование объекта класса в в объект класса А, компилятор не будет знать, использовать ли ему оператор преобразования В: :operator А() для в или конструктор А: :A(Bs;) для А, поскольку оба они получают в качестве аргумента объект класса В и создают из него объект класса А. Возможно, результат преобразования в обоих случаях будет одинаков, но компилятору это не известно. Он должен точно знать, какой из способов преобразования вы имеете в виду. Если это не выясняется однозначно, компилятор умывает свои электронные руки и выдает сообщение об ошибке, предоставляя разбираться в проблеме программисту. Перегрузка оператора присвоения /3 э/ной главе... Опасная работа, коварная работа, кошмарная работа... Знакомство с перегрузкой оператора присвоения Зашита членов главе 24 грузка операторов , в общих чертах рассматриваются вопросы перегрузки операторов для определенных вами классов. Независимо от того, будете ли вы перегружать все операторы или нет, с перегрузкой оператора присвоения стоит познакомиться как можно раньше. Вообще говоря, перегрузка операторов в C++ довольно опасное занятие. Однако, если вы будете следовать приведенному в этой главе шаблону, то с перегрузкой оператора присвоения cperator= () никаких проблем не возникает. Опасная fiao0Ui, tcoeafmasi fuiOifia, кошма/гноя fiaSoiHa... В языке С определен только один оператор, который может быть применен к структурированным типам: оператор присвоения. Приведенный ниже пример был бы корректен в С, и его результатом была бы побитовая копия структуры source в destination: void fn(; struct mistrust source, destination; destination = source; Для обеспечения совместимости с С язык C++ определяет оператор присвоения operator={) по умолчанию для всех пользовательских классов. Этот оператор по умолчанию выполняет почленное копирование для каждого члена класса. И, конечно же, этот оператор может быть перегружен с помощью функции operator=() в любом пользовательском классе. Оператор присвоения очень похож на конструктор копирования, с которым вы встречались в главе 19, Копирующие уктор . При использовании оператор присвоения и конструктор копирования выглядят почти идентично: void fn(MyClassS mc) { MyClass newMC = mc; Конструктор копирования newKC = mc; Оператор присвоения Различие заключается в том, что, когда вызывается копирующий конструктор для newMC, самого объекта newMC еше не существует. А когда вызывается оператор присвоения. newMC уже является полноценным объектом класса MyClass. Копирующий конструктор используется при создании объекта, который должен быть копией другого объекта. Оператор присвоения используется, когда объект, стоящий справа от оператора, копируется в существующий объект, который находится слева от оператора присвоения. Подобно конструктору копирования, оператор присвоения нужен, когда поверхностного копирования недостаточно. SncuccJiCffUh Hefiei/tifSKOU Эта процедура аналогична перегрузке любого другого оператора. Например, в приведенной ниже программе оператор присвоения реализован как встроенная функция-член класса Name (не забывайте, что оператор присвоения должен быть функцией- членом класса). tinclude <stdlib.h> #include <string.h> #include <ctype.h> class Name public: Name() pName = (char*)0; Name(char *pN) copyName (pN) ,- Name(Name& s) copyName(s.pName); -Name() deleteNarae(); оператор присвоения Names operator=(Names s) Сперва уничтожим существующий объект.. . deleteName(); ...перед тем, как заменить его новым copyName(s.pName); Вернем ссылку на существующий объект return *this; protected: / / copyName - копирует исходную строку pN в локально выделенный блок памяти void copyName(char *pN)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |