|
Программирование >> Программирование на языке c++
String operator=(string str1,const string str2); приведет к копированию stri и str2 в стековую память функции operator. В результате будет затрачено много дополнительной памяти. Передача же указателей на соответствующие объекты в функцию operator= не разрешена, поскольку оператор можно доопределять только по отношению к классу (об этом говорилось выше), и хотя бы один из аргументов глобальной функции operator должен иметь тип class. Таким образом, наиболее эффективным решением рассматриваемой задачи является использование ссылок. Возвращаемым значением функции тоже может быть ссылка. Однако в этом случае возвращаемое значение не может быть автоматической (локальной) или статической локальной переменной (см. прил. 2.2). Доопределение оператора = позволяет решить проблему присваивания, но не позволяет решить проблему инициализации, поскольку при инициализации должен вызываться соответствующий конструктор. В результате в примере void function(void) { string str1(30); string str2 = str1; } конструируется одна строка (stri), a разрушаются две (stri и str2). Эта проблема решается введением так называемого конструктора для копирования (сору constructor). Делается это, например, так: class string { char* pointer to string; unsigned size; public: string(unsigned s) { pointer to string=new char[size=s];} -StringO { delete[] pointer to string; } string& operator=(const string&); string(const string&); это copy constructor string::string(const string& str) описание copy constructor { pointer to string = new char[size=str.size]; strcpy(pointer to string,str.pointer to string); } Здесь для типа TYPE конструктор для копирования имеет вид: TYPE(const TYPE&); Он выполняет все необходимые действия по инициализации объекта того же типа TYPE. Таким образом, в общем случае для выполнения операций присваивания и инициализации для объектов класса my class необходимы две функции: class my class { public: my class(const my class&); конструктор для копирования my class& operator=(const my class&); доопределение }; Если класс имеет деструктор, то, как правило, указанные выше функции должны быть определены. Предположим, для класса my c}ass указанные выше функции не определены. Тогда компилятор сам сгенерирует такие операции, когда будет выполнено присваивание одного объекта другому. В результате значения компонентов-данных одного объекта будут скопированы в компоненты-данные другого объекта (того же класса). Это допустимо для простых классов и недопустимо для объектов, которые конструируются при использовании операторов для динамического выделения памяти, рассмотренных в этом параграфе. Рассмотрим два примера. Первая программа показывает доопределение оператора присваивания (=). #include <iostream.h> #include <string.h> class A { char* p; unsigned size; public: A(unsigned s,const char* c) { p=new char[slze=s]; конструктор strcpy(p,c); } ~A() { delete[] p; } деструктор А& operator ={const А&); доопределение оператора = void display{void) { cout р endl; } А& A::operator=(const A& a) доопределение оператора = { if(this!=&a) { delete[] p; p=new char[size=a.size]; strcpy(p,a.p); } return *this; void main(void) { A a1(10, Aveiro ),a2{20, Aveiro University ); al.displayO; Результат: Aveiro a2.display(); Результат; Aveiro University a1=a2; выполнение доопределенного оператора = al.displayO; Результат: Aveiro University a2.display(); Результат: Aveiro University Вторая программа использует конструктор для копирования. #include <iostream.h> #include <string.h> class A { char* p; unsigned size; public; A(unsigned s,const char* c) { p=new char[size=s]; strcpy(p,c); cout C\t ; } A(const A&); это конструктор для копирования -АО { delete[] р; cout D\t ; } А& operator =(const A&); void display(void) { cout p \t; } A& A::operator={const A& a)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |