|
Программирование >> Программирование на языке c++
{ 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 факториал не будет вычислен (так как получаемые величины
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |