Использование описателя const

Объявление friend

Предположим, мы хотим в дополнение к интерфейсу класса String создать функцию, которая формирует новую строку, являющуюся результатом слияния двух строк, но не изменяет сами аргументы. (Особенно часто подобный интерфейс необходимо создавать при определении операций). Для того чтобы эта функция работала быстро, желательно, чтобы она имела доступ к внутренним атрибутам класса String. Доступ можно разрешить, объявив функцию "другом" класса String с помощью ключевого слова friend:

class String{... friend String concat(const String& s1, const String& s2);};

Тогда функция concat может быть реализована следующим образом:

Stringconcat(const String& s1, const String& s2){ String result; result.length = s1.length + s2.length; result.str = new char[result.length + 1]; if (result.str == 0) { // обработка ошибки } strcpy(result.str, s1.str); strcat(result.str, s2.str); return result;}

С помощью механизма friend можно разрешить обращение к внутренним элементам класса как отдельной функции, отдельному методу другого класса или всем методам другого класса:

class String { // все методы класса StringParser обладают // правом доступа ко всем атрибутам класса // String friend class StringParser; // из класса Lexer только метод CharCounter // может обращаться к внутренним атрибутам // String friend int Lexer::CharCounter(const String& s, char c);};

Конечно, злоупотреблять механизмом friend не следует. Каждое решение по использованию friend должно быть продумано. Если только одному методу какого-либо класса действительно необходим доступ, не следует объявлять весь класс как friend.

Во многих примерах мы уже использовали ключевое слово const для обозначения того, что та или иная величина не изменяется. В данном параграфе приводятся подробные правила употребления описателя const.

Если в начале описания переменной стоит описатель const, то описываемый объект во время выполнения программы не изменяется:

const double pi = 3.1415;const Complex one(1,1);

Если const стоит перед определением указателя или ссылки, то это означает, что не изменяется объект, на который данный указатель или ссылка указывает:

// указатель на неизменяемую строкуconst char* ptr = &string; char x = *ptr;ptr++;*ptr = '0'; // обращение по указателю — допустимо // изменение указателя — допустимо // попытка изменения объекта, на // который указатель указывает – // ошибка

Если нужно объявить указатель, значение которого не изменяется, то такое объявление выглядит следующим образом:

char* const ptr = &string; // неизменяемый указатель char x = *ptr;ptr++;*ptr = '0'; // обращение по указателю – допустимо // изменение указателя – ошибка // изменение объекта, на который // указатель указывает – допустимо

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: