Программирование >>  Программирование на языке c++ 

1 ... 64 65 66 [ 67 ] 68 69 70 ... 159


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)



1 ... 64 65 66 [ 67 ] 68 69 70 ... 159

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика