Статья: Присваивание и Инициализация

Рассмотрим очень простой класс строк string:

struct string {

char* p;

int size; // размер вектора, на который указывает p

string(int sz) { p = new char[size=sz]; }

~string() { delete p; }

};

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

Например:

void f()

{

string s1(10);

string s2(20);

s1 = s2;

}

будет размещать два вектора символов, а присваивание s1=s2 будет портить указатель на один из них и дублировать другой. На выходе из f() для s1 и s2 будет вызываться деструктор и уничтожать один и тот же вектор с непредсказуемо разрушительными последствиями. Решение этой проблемы состоит в том, чтобы соответствующим образом определить присваивание объектов типа string:

struct string {

char* p;

int size; // размер вектора, на который указывает p

string(int sz) { p = new char[size=sz]; }

~string() { delete p; }

void operator=(string&)

};

void string::operator=(string& a)

{

if (this == &a) return; // остерегаться s=s;

delete p;

p=new char[size=a.size];

strcpy(p,a.p);

--> ЧИТАТЬ ПОЛНОСТЬЮ <--

К-во Просмотров: 156
Бесплатно скачать Статья: Присваивание и Инициализация