С++ для начинающих



     Кабошон аквамарина. |     

Оператор =


Присваивание одного объекта другому объекту того же класса выполняется с помощью копирующего оператора присваивания. (Этот специальный случай был рассмотрен в разделе 14.7.)

Для класса могут быть определены и другие операторы присваивания. Если объектам класса надо присваивать значения типа, отличного от этого класса, то разрешается определить такие операторы, принимающие подобные параметры. Например, чтобы поддержать присваивание C-строки объекту String:

String car ("Volks");

car = "Studebaker";

мы предоставляем оператор, принимающий параметр типа const char*. Эта операция уже была объявлена в нашем классе:

class String {

public:

   // оператор присваивания для char*

   String& operator=( const char * );

   // ...

private:

   int  _size;

   char *string;

};

Такой оператор реализуется следующим образом. Если объекту String присваивается нулевой указатель, он становится “пустым”. В противном случае ему присваивается копия C-строки:

String& String::operator=( const char *sobj )

{

   // sobj - нулевой указатель

   if (! sobj ) {

      _size = 0;

      delete[] _string;

      _string = 0;

   }

   else {

      _size = strlen( sobj );

      delete[] _string;

      _string = new char[ _size + 1 ];

      strcpy( _string, sobj );

   }

   return *this;

}

_string ссылается на копию той C-строки, на которую указывает sobj. Почему на копию? Потому что непосредственно присвоить sobj члену _string нельзя:

_string = sobj;   // ошибка: несоответствие типов

sobj – это указатель на const и, следовательно, не может быть присвоен указателю на “не-const” (см. раздел 3.5). Изменим определение оператора присваивания:

String& String::operator=( const *sobj ) { // ... }

Теперь _string прямо ссылается на C-строку, адресованную sobj. Однако при этом возникают другие проблемы. Напомним, что C-строка имеет тип const char*. Определение параметра как указателя на не-const делает присваивание невозможным:

car = "Studebaker";  // недопустимо с помощью operator=( char *) !




Содержание  Назад  Вперед