План лекции: 1 Переопределение операций в С++ 2 Конструкторы 3 Деструкторы Литература




НазваниеПлан лекции: 1 Переопределение операций в С++ 2 Конструкторы 3 Деструкторы Литература
Дата публикации12.10.2013
Размер76.8 Kb.
ТипЛитература
uchebilka.ru > Журналистика > Литература
Лекция№2

План лекции:

2.1 Переопределение операций в С++

2.2 Конструкторы

2.3 Деструкторы

Литература:

2. Фрідман А.Л. Основи об’єктно-орієнтованого програмування на мові С++.- М.: Горячая линия – Телеком, Радио и связь.-1999.-208 с..

3. Бондарев В.М. Программирование на С++.- Харьков: «Компания СМИТ», 2004.- 284 с.

4. С.В. Глушаков, Т.В. Дуравкина. Программирование на С++. –М.:АСТ,2008, 685 с.

2.1 Переопределение операций.

В языке Си++ можно сделать так, что класс будет практически неотличим от предопределенных встроенных типов при использовании в выражениях. Для класса можно определить операции сложения, умножения и т.д. пользуясь стандартной записью таких операций, используя переопределение операций. В языке Си++ считается, что подобная запись - это также вызов метода с именем operator+ того класса, к которому принадлежит объект .

Только 4 операции не допускают переопределение:

-прямой выбор компоненты (.);

-разыменование (*);

-разрешение видимости (::);

  • условная операция (?:)//if (a>=b) max=a; else max=b;

  • //max=a>=b? a:b;

Переопределение операций подчиняется следующим правилам:

  1. Имя переопределяемой операции содержит ключевое слово operator, за которым следует знак операции.

  2. Приоритет операций при переопределении не меняется.

  3. Нельзя изменять число аргументов переопределяемой операции..

  4. Переопределяемая операция не должна иметь аргументов по умолчанию.

  5. Переопределяемая операция должна быть элементом класса или принимать аргументы, имеющие тип класса.

  6. За исключением операции присваивания переопределяемые операции не наследуются.


Пример1.

class date

{public:

int d,m,y; //день, месяц, год

date(int ad,int am,int ay){d=ad;m=am;y=ay;}

int operator++( ); //префиксная:++i;

int operator++(int); //постфиксная:i++;

int operator!=(date d2)

{return ((d!=d2.d)|| (m!=d2.m) || (y!=d2.y));}

};

int date:: operator++( ) //компонента класса

{ return (++d);}

int date:: operator++(int a ) //компонента класса

{ return (*this)++;}

int operator ==(date d1.date d2) //имеет объект класса аргументом

{return ((d1.d==d2.d)&& (d1.m==d2.m)&&) (d1.y==d2.y));}
Пример 2.

// определение класса комплексных чисел (переопределение операций)

class Complex {

public:

int real; //вещественная часть

int imaginary; //мнимая часть

Complex operator+(const Complex x) const; //сложение двух комплексных чисел

};

// определение метода сложения

Complex Complex::operator+(const Complex x) const

{

Complex result;

Result.real = real + x.real;

result.imaginary = imaginary + x.imaginary;

return result;

}

//тестирование класса

#include

#include

int main(int argc, char* argv[])

{

Complex num1; //первый объект класса Complex

num1.real = 1;

num1.imaginary = 3;

Complex num2; //второй объект класса Complex

num2.real = 2;

num2.imaginary = 1;

Complex num3; //третий объект класса Complex

num3=num1+num2;//сложение двух объектов Complex

cout<< num1.real<<”+i”<< num2.imaginary<
getch();

return 0;

}

Вместо метода Add появился метод operator+. Изменилось и его определение.

Во-первых, этот метод возвращает значение типа Complex (операция сложения в результате дает новое значение того же типа, что и типы операндов).

Во-вторых, перед аргументом метода появилось ключевое слово const. Это слово обозначает, что при выполнении данного метода аргумент изменяться не будет. Также const появилось после объявление метода. Второе ключевое слово const означает, что объект, выполняющий метод, не будет изменен. (При выполнении операции сложения х + у над двумя величинами х и у сами эти величины не изменяются).

2.2 Конструкторы.

При определении класса имеется возможность задать для объекта начальное значение.

Специальный метод класса, называемый конструктором, выполняется каждый раз, когда создается новый объект этого класса

Конструктор - это метод, имя которого совпадает с именем класса. Конструктор не возвращает никакого значения.

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

Конструктор класса – это открытый метод класса. Наличие конструктора в классе не обязательно. Если класс вообще не имеет конструкторов, то память для объекта выделяется, но его данные не инициализируются. Если программист не определил конструктор, то транслятор сам строит стандартный конструктор без параметров.

Конструктор без аргументов называется стандартным конструктором или конструктором по умолчанию

При наличии других конструкторов стандартный конструктор требует явного определения.

Пример 4. Использование двух конструкторов в классе Complex

//---------------------------------------------------------------------------

#include

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

#include

#include

class Complex

{public:

Complex(); //стандартный конструктор

Complex(int,int); //конструктор с параметрами

Complex operator+(const Complex x)const;

void write();

private:

int real;

int imag;

};

//реализация конструкторов

//стандартный конструктор

Complex::Complex()

{ real=0;

imag=0;

}

//конструктор с параметрами

Complex::Complex(int r,int im)

{ real=r;

imag=im; }

Complex Complex::operator+(const Complex x)const

{Complex result;

result.real=real+x.real;

result.imag=imagl+x.imag;

return result;

}

void Complex::write()

{cout<
getch();

}

int main(int argc, char* argv[])

{ Complex n1,n4;

Complex n2(3,4);

Complex n3(2,3);

n4=n2+n3;

n1.write();

n2.write();

n3.write();

n4.write();

getch();

return 0;

}

Пример 5. Для класса Complex, который мы рассматривали ранее, кроме стандартного конструктора можно задать конструктор с параметрами по умолчанию и копирующий конструктор.

class Complex

{

public:

Complex ();

Complex(int rl, int im = 0);

Complex (const Complex& c);

//прибавить комплексное число

Complex operator+(const Complex x) const;

private:

int real; //вещественная часть

int imaginary; //мнимая часть

};

//

//Стандартный конструктор создает число (0, 0)

//

Complex::Complex() : real(0), imaginary(O)

{}

//

//Создать комплексное число из действительной и мнимой частей. У второго //аргумента есть значение по умолчанию - мнимая часть равна нулю по умолчанию

//

Conplex::Complex(int rl, int im) :

real(rl), imaginary(0) {}

//Скопировать значение комплексного числа

Complex::Complex(const Complexs c) :

real(c.real), imaginary(c.imaginary) {}

Теперь при создании комплексных чисел происходит их инициализация:

Complex xl; //начальное значение - ноль

Complex x2(3); // мнимая часть по умолчанию равна 0 создается дествительное число 3

Complex хЗ(0, 1); // мнимая единица

Complex у(хЗ); // мнимая единица

Пример 6. Пример класса date стремя конструкторами

class date{

int day, month, year;

public:

date (int, int, int);

date (char*);

date ();

};

Примеры инициализации объектов:

date d1=date (13,11,2004); // 1-й конструкт

date d2 (13,11,2004); // 1-й конструкт

date d3=date (“13-Nov-2004”); // 2-й конструкт

date d4= “13-Nov-2004”; // 2-й конструкт.

date d5; // 3-й конструкт

2.3 Деструкторы

Аналогично тому, что при создании объекта выполняется конструктор, при уничтожении объекта выполняется специальный метод класса, называемый деструктором. Обычно деструктор освобождает ресурсы, использованные данным объектом.

У класса может быть только один деструктор. Его имя - это имя класса перед которым добавлен знак тильда '~'.

Например, для объектов класса String деструктор должен освободить память, используемую для хранения строки:

class String

{

~String ();

};

String::~String()

{

if (str)

delete str;

}

Если деструктор не объявлен в определении класса, то при уничтожении объекта никаких действий не производится.

Деструктор вызывается всегда перед тем, как освобождается память, выделенная под объект. Если объект типа String был создан с помощью операции new, то при вызове

delete sptr;

выполняется деструктор ~String( ), а затем освобождается память, занимаемая этим объектом. Предположим, в некой функции объявлена автоматическая переменная типа String:

int funct(void)

{

String str;

. . .

return 0;

}

При выходе из функции funct по оператору return переменная str будет уничтожена: выполниться деструктор и затем освободиться память, занимаемая этой переменной.

В особых случаях деструктор можно вызвать явно:

sptr->~String();

Такие вызовы встречаются довольно редко, при переопределению операций new и delete.

Добавить документ в свой блог или на сайт

Похожие:

План лекции: 1 Переопределение операций в С++ 2 Конструкторы 3 Деструкторы Литература iconПлан: Введение 3 Глава Организационно-правововые основы операций...
Целью работы является изучение проблем и перспектив развития операций коммерческих банков с ценными бумагами

План лекции: 1 Переопределение операций в С++ 2 Конструкторы 3 Деструкторы Литература iconПлан чтения лекции по учебной дисциплине "Математические методы"

План лекции: 1 Переопределение операций в С++ 2 Конструкторы 3 Деструкторы Литература iconРеферат скачан с сайта allreferat wow ua Литература эпохи войн и...

План лекции: 1 Переопределение операций в С++ 2 Конструкторы 3 Деструкторы Литература iconПлан счетов бухгалтерского учета активов, капитала, обязательств...
План счетов бухгалтерского учета активов, капитала, обязательств и хозяйственных операций предприятий и организаций

План лекции: 1 Переопределение операций в С++ 2 Конструкторы 3 Деструкторы Литература iconЛитература Введение
Для этого необходимо аргументировать и обосновать оформление проектов, требующих инвестиций. Очень важно оформить все мысли планы...

План лекции: 1 Переопределение операций в С++ 2 Конструкторы 3 Деструкторы Литература iconЛитература по психологии,классическая литература,компютерное железо,документация,языкипрограммирования,религия,философия,самые...
Альдебаран-крупнейшая электронная библиотека on-line- художественная, учебная и техническая литература и книги различных жанров:...

План лекции: 1 Переопределение операций в С++ 2 Конструкторы 3 Деструкторы Литература iconРона Хаббарда "Лекции в Фениксе"
Аксиомы Саентологии, главы из книги Л. Рона Хаббарда "Лекции в Фениксе" (лекции, прочитанные в 1954 году в городе Феникс, штат Аризона,...

План лекции: 1 Переопределение операций в С++ 2 Конструкторы 3 Деструкторы Литература iconРона Хаббарда «Лекции в Фениксе»
Аксиомы Саентологии, главы из книги Л. Рона Хаббарда «Лекции в Фениксе» (лекции, прочитанные в 1954 году в городе Феникс, штат Аризона,...

План лекции: 1 Переопределение операций в С++ 2 Конструкторы 3 Деструкторы Литература iconРегистратор расчетных операций в вопросах и ответах
Отчет об использовании регистраторов расчетных операций и книг учета расчетных операций по форме №3вр-1?

План лекции: 1 Переопределение операций в С++ 2 Конструкторы 3 Деструкторы Литература iconПлан проведения лекции по курсу "Клиническая психология" со слушателями (курсантами)
Ахутина Т. В. "Нейролингвистический анализ динамической афазии". г. Москва, 1975 г

Вы можете разместить ссылку на наш сайт:
Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
uchebilka.ru
Главная страница


<