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

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


{ if(this!=&a) { delete[] р;

p=new char[size=a.size]; strcpy(p,a.p); } return *this;

A::A{const A& a) описание конструктора для копирования { p=new char[size=a.size];

strcpy(p,a.p);

cout C\t ; } void main(void)

{ A a1{10, Aveiro ),a2(20, Aveiro University ); a1.displayO; Результат: Aveiro A a3=a1; здесь вызывается конструктор

для копирования aS.displayO; Результат: Aveiro

Результаты работы программы представятся в виде:

С С Aveiro С Aveiro D D D

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

операнд 1 = операнд 2

Соответствующая функция operator= может быть определена как нестатическая компонент-функция класса А. Обращение к ней будет осуществляться в следующей форме: оА = ор2, где первый операнд оА - это объект класса А, в котором описана функция operator, второй операнд (ор2) - это параметр, передаваемый функции operator. Выражение оА = ор2 интерпретируется как oA.operator=(op2).

5.6. Функция operator[]

Оператор [] представляется в следующей форме: операнд 1 [ операнд 2 ]



Соответствующая функция operator]] может быть определена как нестатическая компонент-функция класса А, а также любого производного от А класса. Обращение к ней будет осуществляться в следующей форме: oA[i], где первый операнд оА - это объект класса А, в котором описана функция operator, второй операнд - это параметр, передаваемый функции operator. Выражение oA[i] интерпретируется как oA.operator[j(i).

Функция operatorO может быть использована для передачи значения индекса в класс и получения значения элемента массива класса с заданным индексом. Рассмотрим простой пример:

#define к 10 class string {

char* pointer to string;

unsigned size; public:

string(unsigned s) { pointer to string=new

char[size=s]; } -StringO { delete[] pointer to string; } char& operator[](int);

char& string::operator[](int i)

{ if{(i<0)l{>=sze)) { cerr неправильный индекс\п ; i=0; }

return pointer to string[i]; } void main(void) { string my string(k); for(int j=0;j<k;j-H-H)

my string[j] = j-l-O; for{j=k-1;j>=0;j-)

cout my string[j]; cout endl; }

Здесь функция operatorO проверяет правильность значения индекса (т. е., что индекс лежит в диапазоне допустимых значений индекса для заданного массива), передает индекс массиву pointer to string с атрибутом private (этот массив задает-



СЯ через указатель на его начало) и возвращает значение соответствующего элемента массива. В гл. 7 будет показано, что проверку правильности индекса лучше производить с помощью механизма обработки исключений.

В целом использование функции operatorO позволяет описывать связанные массивы. Эта функция должна быть компонентом-функцией класса. Первым операндом функции operatorO является класс, компонентом которого она является. Второй операнд (индекс) может быть любого типа.

Рассмотрим пример программы, осуществляющей доопределение оператора О- Пусть заданы класс fact и объект F этого класса. Доопределим оператор О так, что выражение F[n] будет выводить на экран факториал п (т. е. п!).

#include <iostream.h>

#include <values.h> здесь определена константа

MAXLONG - максимально допустимое длинное целое число class fact { класс fact (факториал)

long 1; public:

void operator[](int); operator[] функция

void fact::operator[](int n) описание operator[] функции

{ 1=1;

for(int i=1;i<=n;i-l~h)

if (I > MAXLONG/i) cerr error:\t ; else l*=i; cout result: I endl;

void main(void) { fact F;

for(int i=1;i<15;i+-l-)

F[i];

В результате выполнения программы на экран будут выведены значения факториала от 1 до 12. Для значений 13 и 14 факториал не будет вычислен (так как получаемые величины



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

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