Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++ - ООП.doc
Скачиваний:
15
Добавлен:
21.09.2019
Размер:
399.87 Кб
Скачать

Void queue::init(void)

{

sloc=rloc=0;

}

Это определение функции init() класса queue. Операция :: называется операцией принадлежности (scope resolution). Она определяет к какому классу принадлежит эта функция. Имя queue::init - полное или квалифицированное имя функции-члена класса.

В С++ разные классы могут иметь функции с одинаковыми именами. Операция :: и имя класса позволяют компилятору определить принадлежность функции.

Чтобы вызвать функцию-член класса в той части программы, которая не является частью класса, надо использовать имя объекта и операцию “.” доступа к члену (элементу) класса. Например

queue a,b; // два объекта класса queue

тогда a.init(); // вызов функции init() для объекта класса queue

В данном случае a и b два разных объекта. Данные – члены этих объектов занимают в памяти разное место, но функции-члены класса – общие. Функции-члены класса для того, чтобы отличать один объект от другого, имеют неявный параметр, указатель на объект. Этот указатель называется this

Замечание Функция-член класса может вызывать другую функцию-член того же класса или использовать данные-члены класса непосредственно, не использую операцию “.”. Операцию “.” надо использовать только тогда, когда функция-член класса вызывается в функциях, не являющихся членами класса (nomember functions).

Пример

// Модель - очередь

#include <iostream.h>

#include <conio.h>

class queue {

int q[10];

int sloc,rloc;

public:

void init(void); // прототип

void qput(int); // прототип

int qget(void); // прототип

};

void queue::init(void) // объявление функций-членов класса

{

rloc=sloc=0;

}

int queue::qget(void) {

if (sloc==rloc)

{

cout<<"\n Очередь пустая";

return 0;

}

return q[rloc++];

}

void queue::qput(int i) {

if (sloc==10)

{

cout<<"\n Очередь полная";

return;

}

q[sloc++]=i; }

main(void)

{/

queue a,b; // Создание двух объектов

a.init(); // Инициализация объекта a

b.init(); // Инициализация объекта b

a.qput(7);

a.qput(9);

a.qput(11);

cout<<a.qget()<<" ";

cout<<a.qget()<<" ";

cout<<a.qget()<<" ";

cout<<a.qget()<<"\n";

for(int i=0;i<12;i++)

b.qput(i*i);

for(i=0;i<12;i++)

cout<<b.qget()<<" ";

cout<<"\n\n";

getch();

return 0;

}

Перегруженные функции

Одним из путей реализации полиморфизма в языке С++ является перегрузка функций. Две или более функций могут иметь одно и тоже имя, но отличаться друг от друга количеством или типом параметров. Тогда говорят о перегруженных функциях (overload functions).

Пример

#include <iostream.h>

// overload functions

Int sqr_it(int I); // Прототипы

double sqr_it(double d); // функций

long sqr_it(long l); // с различными параметрами

main(void) {

int i=7; double d=1.1; long l=20;

cout<<sqr_it(i)<<"\n"; // вызов

cout<<sqr_it(d)<<"\n"; // с переменными

cout<<sqr_it(l)<<"\n";

cout<<sqr_it(10)<<"\n"; // вызов с константами

cout<<sqr_it(10.1)<<"\n";

cout<<sqr_it(70000)<<"\n";

cout<<sqr_it(101)<<"\n";

unsigned u=4;

// cout<<sqr_it(u)<<"\n"; // Некорректный параметр --> ошибка!!!

return 0;

}

int sqr_it(int i) {

cout<<"\n Функция с целочисленным аргументом ";

return i*i;

}

double sqr_it(double d) {

cout<<"\n Функция с вещественным удвоенной точности ";

return d*d;

}

long sqr_it(long l) {

cout<<"\n Функция с вещественным удвоенной точности (длинным 10 байт) ";

return l*l;

}

Перегрузка функций позволяет использовать одно и тоже имя для выполнения одинаковых или похожих действий с аргументами.

В С есть функции atoi(), atof(), atol(), которые преобразуют строку цифр во внутренний формат представления чисел, соответственно, int, double, long double. Каждое из них выполняет почти идентичные действия.

В С++ возможно использование одного имени atonum() для всех трех функций. Способ преобразования будет выбираться в зависимости от типа аргумента функции atonum().