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

7.2. Как объявлять функции класса?

Определение методов во многом напоминает определение обычных функции. Небольшие функции-элементы можно определять внутри определения класса:

class Stock

{

private:

int shares;

double total_val;

double share_val;

void set()

{ total_val=shares*shares_val;} // определение метода Stock.set()

};

Более общий способ позволяет определять методы вне класса и даже в отдельном файле. Для этого используется оператор принадлежности (::) для идентификации класса. Заголовок метода в этом случае может выглядеть так:

void Stock::update(double price)

Рассмотрим “действующий” пример использования класса1 в программе, которая добавляет или снимает некоторые суммы с вклада:

#include <iostream.h>

#include <string.h> // для использования функции strncpy

#include <stdlib.h>

class Stock

{

private:

char company[30];

int shares;

double share_val;

double total_val;

void set_tot() // встроенная функция

{total_val=shares*share_val;}

public:

void acquare(const char * co,int n, double pr);

void buy(int num, double price);

void sell(int num, double price);

void update(double price);

void show();

}; // конец описания класса

// начала определения методов класса

void Stock::acquare(const char * co,int n, double pr)

{

strncpy(company,co,29); // стандартная функция strncpy "усекает"

// при необходимости строку до 29 символов.

company[29]='\0'; // конец строки

shares=n;

share_val=pr;

set_tot(); // можно использовать встроенные функции класса.

}

void Stock::buy(int num,double price)

{

shares+=num;

share_val=num;

set_tot();

}

void Stock::sell(int num,double price)

{

if (num>shares)

{

cerr<<"You can't sell more than you have! \n";

exit(1);

}

shares-=num;

share_val=price;

set_tot();

}

void Stock::update(double price)

{

share_val=price;

set_tot();

}

void Stock::show()

{

cout<<"Company:"<<company

<<"Shares: "<<shares<<'\n'

<<"Share Prce: $"<<share_val

<<"Total Worth:$"<<total_val<<'\n';

}

int main()

{

Stock stock1; // определение объекта stock1 класса Stock

stock1.acquare("NanoSmart",20,12.50);

stock1.show();

stock1.buy(15,18.25);

stock1.show();

return 0;

}

Обратите внимание, что в приведенном листинге текст main() по размеру намного меньше собственно описания класса. И хотя главная программа здесь используется всего лишь как платформа для тестирования конструкции класса Stock, такое соотношение объемов в объектно-ориентированном программировании вполне обычно.

Несколько замечаний к программе. Чтобы создать элемент класса (объект) используется имя класса, как если бы это было имя типа:

Stock stock1;

Метод класса может быть вызван только объектом класса, при этом используется точка:

stock1.buy(15,18.25);

7.3. Конструкторы и деструкторы классов.

Одна из целей С++ ‑ сделать использование объектов класса таким же простым, как и использование стандартных типов. Для этого следует “научить” класс инициализировать объект данными. Для этого служит функция-конструктор. В приведенном выше примере описание конструктора может выглядеть так:

Stock (const char * co, int n=0, double pr=0.0); // прототип функции

Тем не менее, инициализировать объект Stock тем же способом, что и структуру не удастся.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]