|
Программирование >> Инициализация объектов класса, структура
String object( Danny ); String *ptr = new String ( Anna ); стрелка (->). Пусть м1 имеем объявления объектов типа String: String array[2]; vector<int> sizes( 3 ); доступ к члену для objects (.); objects имеет размер 5 sizes[ 0 ] = object.size(); доступ к члену для pointers (->) ptr имеет размер 4 sizes[ 1 ] = ptr->size(); доступ к члену (.) array[0] имеет размер 0 Вот как выглядит вызов функции size() для этих объектов: sizes[ 2 ] = array[0].size(); Она возвращает соответственно 5, 4 и 0. String namel( Yadie ); String name2( Yodie ); bool operator==(const Strings) if ( namel == name2 ) return; else Strings operator=( const Strings ) Перегруженные операторы применяются к объекту так же, как обычные: namel = name2; Объявление функции-члена должно находиться внутри определения класса, а определение функции может стоять как внутри определения класса, так и вне его. (Обе функции size() и c str() определяются внутри класса.) Если функция определяется вне класса, то мы должны указать, кроме всего прочего, к какому классу она принадлежит. В этом случае определение функции помещается в исходный файл, допустим, String.C, а определение самого класса - в заголовочный файл (String.h в нашем примере), который должен включаться в исходный: отдельных конкретизаций различаются. Для нашего класса String мы создадим по два различных оператора присваивания и проверки на равенство. Для вызова функции-члена применяются операторы доступа к членам - точка (.) или вкчение определения функции strcmp() содержимое исходного файла: String.С вкчение определения класса String #inc1ude String.h / / вкчение опреде #inc1ude <cstring> bool тип возвращаемого значения String:: класс, которому принадлежит функция operator== имя функции: оператор равенства (const String srhs) список параметров { if ( size != rhs. size ) return false; return strcmp( strinq, rhs. string ) ? false : true; Напомним, что strcmp() - функция стандартной библиотеки С. Она сравнивает две строки встроенного тина, возвращая 0 в случае равенства строк и ненулевое значение в случае неравенства. Условный оператор (?:) проверяет значение, стоящее перед знаком вопроса. Если оно истинно, возвращается значение выражения, стоящего слева от двоеточия, в противном случае - стоящего справа. В нашем примере значение выражения равно false, если strcmp() вернула ненулевое значение, и true - если нулевое. (Условн1й оператор рассматривается в разделе 4.7.) Операция сравнения довольно часто используется, реализующая ее функция получилась небольшой, поэтому полезно объявить эту функцию встроенной (inline). Компилятор подставляет текст функции вместо ее вызова, поэтому время на такой вызов не затрачивается. (Встроенные функции рассматриваются в разделе 7.6.) Функция-член, определенная внутри класса, является встроенной по умолчанию. Если же она определена inline bool String::operator==(const String srhs) { то же самое вне класса, чтобы объявить ее встроенной, нужно употребить ключевое слово inline: Определение встроенной функции должно находиться в заголовочном файле, содержащем определение класса. Переопределив оператор == как встроенный, мы должны переместить сам текст функции из файла String.C в файл String.h. Ниже приводится реализация операции сравнения объекта String со строкой inline bool String::operator==(const char *s) { return strcmp( string, s ) ? false : true; встроенного типа: #include <cstring> default constructor inline String::String() { size = 0; string = 0; inline String::String( const char *str ) { if ( ! str ) { size = 0; string = 0; else { size = str1en( str ); string = new char[ s strcpy( string, str ) ize + 1 ]; copy constructor inline String::String( const String srhs ) { size = rhs. size; if ( ! rhs. string ) string = 0; else { string = new char[ size + 1 ]; strcpy( string, rhs. string ); объявлены встроенными. Поскольку мы динамически выделяли память с помощью оператора new, необходимо освободить ее вызовом delete, когда объект String нам больше не нужен. Для этой цели служит еще одна специальная функция-член - деструктор, автоматически вызываемый для объекта в тот момент, когда этот объект перестает существовать. (См. главу 7 о времени жизни объекта.) Имя деструктора образовано из символа тильды (~) и имени класса. Вот определение деструктора класса String. Именно в нем мы вызываем операцию delete, чтобы освободить память, выделенную в конструкторе: inline String: :~String() { delete [] string; } В обоих перегруженных операторах присваивания используется специальное ключевое слово this. String namel( orville ), name2( wilbur ); Когда мы пишем: namel = Orville Wright ; Имя конструктора совпадает с именем класса. Считается, что он не возвращает значение, поэтому не нужно задавать возвращаемое значение ни в его определении, ни в его теле. Конструкторов может быть несколько. Как и любая другая функция, они могут быть
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |