89789

Конструкции классов и области видимости

Лекция

Информатика, кибернетика и программирование

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

Русский

2015-05-13

95.26 KB

1 чел.

Конструкции классов и области видимости

Содержание:

  1.  Конструкции классов
  •  struct
  •  union
  •  class
  1.  Области видимости
  •  public
  •  protected
  •  private
  1.  Сокрытие методов класса

Классэто производный структурированный тип, который задает некоторую совокупность типизированных данных и позволяет определить набор операций над этими данными.

Класс можно определить с помощью следующих ключей:

struct – структура

union объединение

class  –класс

Конструкция класса:

ключ-класса имя_класса {список_компонентов};

где список компонентов класса может включать:

  •  Типизированные данные
  •  Функции
  •  Классы
  •  Перечисления
  •  Битовые поля
  •  Дружественные функции и классы
  •  Имена типов

Структура struct

Структура содержит индивидуально именованные компоненты, называемые членами. Поскольку члены структуры могут быть различных типов, программист может создавать данные, позволяющие описывать сложные данные.

Пример #1. Комплексное число

Опишем класс «комплексное число», где компонентами будут:

  •  Вещественная часть числа
  •  Мнимая часть числа
  •  Функция ввода комплексного числа
  •  Функция вывода на экран комплексного числа

Определение и описание объектов (экземпляров) класса:

complex X1, X2, D;
complex *point=&D;//указатель на объект класса
complex dim[8];//массив объектов класса

Обращение к компонентам класса

  1.  С помощью «квалифицированных» имен:

имя_объекта.имя_класса::имя_компоненты

  1.  Через уточненное имя

имя_объекта.имя_ компоненты

  1.  Использование указателя на объект класса и операции косвенного выбора компоненты

указатель_на_объект_класса->имя_ компоненты

Например:

X1.complex::real=dim[3].real=1.24;

X1.imag=2.3; dim[3].imag=0.0;

X1.define();//параметры выбираются 

//по умолчанию real=0.0, imag=0.0

X2.define(4.3,20.0);//комплексное число 4.3+20.0*i

X2.display();

//Оператор указателя на структуру

point->real=2.3;

point->imag=6.1;

point->display();

return 0;

Области видимости:

private собственные, доступные только внутри класса; 

protected –защищенные, доступные еще в дочерних классах;

public общедоступные.

В struct все компоненты по умолчанию общедоступные, если не указана другая область видимости.

Пример:

//Complex1.cpp

#include <iostream.h>

//класс с конструктором и инкапсуляцией данных

struct complex{// общедоступные компоненты

complex (double re=1.0, double im=0.0)

{ real=re; imag=im; }

void display(void)

{ std::cout<<“real=“<<real<< “, imag=“<<imag<<“\n”; }

//получить доступ к вещественной и мнимой части числа

double& re(void){ return real; }  //возвращает ссылки на вещ. 

double& im(void){ return imag; } //и мнимую части объекта

private: //данные класса скрыты

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

double imag; // мнимая часть

} ;

int  main()   

{

complex a,b(1.5,2.5),c(2.8);

a.display();

std::cout<<b.im()<<“ “<<b.re()<<“\n”;

c.display();

return 0;

}

Объединение union

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

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

Пример #2. Дни недели

#include <iostream.h>

int main(){

enum week {sun, mon, tues, weds, thurs, fri, sat};

union st{    int i; week w;};

st f={5};      // тоже, что и f.i=5;

if (f.w==sat || f.w==sun) std::cout<<“Выходной!”;

return 0;

}

Пример #3.1 Дни недели

#include <iostream.h>

int main(){

enum week {sun, mon, tues, weds, thurs, fri, sat};

union st{ int i; week w; st() {w=mon;};

void define (week im) { w=im; };

void display(void){ cout<<"i="<<i; };};

st f, g; f.display(); f.i=6;

if (f.w==sat || f.w==sun) cout<<"Выходной!";

g.define(sun);  g.display();

return 0;

}

Пример #3.2 Дни недели

#include <iostream.h>

int main(){

enum week {sun, mon, tues, weds, thurs, fri, sat};

union st{ private: int i; week w;

public: st() {w=mon;}; week &ww(){return w;}

void ii(int a){i=a;}

void define (week im) { w=im; };

void display(void){ cout<<"i="<<i; };};

st f, g; f.display(); f.ii(6);

if (f.ww()==sat || f.ww()==sun) cout<<"Выходной!";

g.define(sun); g.display();

return 0;}

По сравнению со структурами на объединения налагаются некоторые ограничения:

  •  объединение может инициализироваться только значением его первого элемента;
  •  объединение не может содержать битовые поля;
  •  объединение не может содержать виртуальные методы, конструкторы деструкторы и операцию присваивания;
  •  объединение не может входить в иерархию классов.

Класс class

Классэто производный тип для описания данных и их методов, но отличается от структуры тем, что области видимости нужно объявлять явно, по умолчанию компоненты не являются общедоступными, конструкторов может быть несколько (перегрузка), но только один с умалчиваемыми значениями параметров.

Пример:

//Complex.cpp

#include <iostream.h>

//класс с конструктором и инкапсуляцией данных

class complex{

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

double imag;// мнимая часть

public:

complex (double re=1.0, double im=0.0)

{ real=re; imag=im; }

void display(void)

{ cout<<“real=“<<real; cout << “, imag=“<<imag; }

double& re(void){ return real; }//возвращает ссылки на вещ. 

double& im(void){ return imag; }//и мнимую части объекта

};

int main(void)

{

complex a,b(1.5,2.5),c(2.8);

a.display;

cout<<b.im()<<b.re();

c.display();

return 0;

}

Описание класса с внешними определениями методов

Как и в C, важно различать интерфейсные файлы (имеющие расширение ".h") и файлы реализации (расширение зависит от системы, например.cpp”). 

// файл complex.h

#ifndef COMPH

#define COMPH 

// описание класса

#endif

Интерфейсный файл может содержать описания более чем одного класса (если классы тесно связаны). Языки C и C++ используют условное подключение файла: когда файл complex.h считывается впервые, символ COMPH (предполагается, что он не встречается в других местах) является неопределенным, и тем самым срабатывает условный оператор ifndef (если не определено). Значит, файл complex.h будет считан. При всех последующих попытках считать этот файл символ будет известен, и загрузка файла будет пропущена. 

Файл реализации complex.cpp для данного класса должен обеспечить работу методов, описанных в интерфейсном файле. 

#include <iostream.h>

#include "complex.h"

complex::complex (double re, double im)

{real=re; imag=im;};

void complex::display(void)

{cout<<real<<“+”<<imag<<“ *i ”;};

double& complex::re(void){return real;};

double& complex::im(void){return imag;};

Файл, включающий заголовочный файл complex.h:

#include "complex.h"

int main(void){

complex G(1.0,2.5);

//G.complex(1.0, 2.5); - так нельзя!

G.display();

return 0;

}

Затем complex.cpp компилируем и получаем objфайл.

Этот файл на стадии компоновки (команда link.exe) объединяет все объектные модули с главным модулем (файл с функцией main), а также со стандартными библиотеками языка С++, и получаем запускающий exe-файл.

С этой целью удобнее создавать файл проекта с расширением prj, куда  добавлены все необходимые компоненты.


 

А также другие работы, которые могут Вас заинтересовать

51258. ІСТОРІЯ ЕКОНОМІКИ ТА ЕКОНОМІЧНОЇ ДУМКИ 84.42 KB
  У методичних рекомендаціях викладено загальні положення та тематичний зміст практичних занять з нормативної навчальної дисципліни циклу природничо-наукової та загальноекономічної підготовки «Економічна історія». Наведено перелік питань для обговорення з кожної теми, тести для відповідей, перелік рекомендованої літератури.
51259. БОЛЬНИЧНАЯ ГИГИЕНА (РУКОВОДСТВО К ПРАКТИЧЕСКИМ ЗАНЯТИЯМ) 790.5 KB
  Вопросы гигиены лечебно-профилактических учреждений являются одними из самых существенных в курсе гигиены для студентов лечебного и педиатрического факультетов.
51260. Расчет математического ожидания, среднего квадратического отклонения, дисперсии, с помощью программы Microsoft Excel 33.5 KB
  Так как функция математического ожидания это т оже самое что и функция среднего арифметического то: в пустой ячейке вводим = далее нажимаем fx выбираем функцию СРЗНАЧ выделяем числовые данные нашей исходной таблицы. Вычислить дисперсию: Вводим = далее fx Статистические ДИСП выделить числовые данные...
51261. Финансы - сложная экономическая категория 409.5 KB
  Расширенное воспроизводство включает непрерывное возобновление и расширение производственных фондов, рост валового внутреннего продукта (ВВП) и его главной части – национального дохода, воспроизводство рабочей силы и производственных отношений. Оно осуществляется с использованием товарно-денежных, финансовых и кредитных отношений
51262. Оценка вероятностей, с помощью компьютерных программ Microsoft Excel и Калькулятор 26.5 KB
  Задача работы: оценить вероятность безошибочного написания СМС, которое состоит из 10 символов со 100 нажиманий клавиш, если в 30 случаях нажимания клавиш есть ошибка.
51263. Оценка парных связей между случайными переменными 31 KB
  Просчитать коэффициент корреляции в программе Microsoft Excel: = нажать fx выбрать в поиске всех формул КОРРЕЛ массив1 числа соответствующие обменному пункту №1 массив2 – пункту №2.
51265. Построение графа состояний P-схемы 157 KB
  Задание 1. Построить граф состояний P-схемы. Смысл кодировки состояний раскрыть (время до выдачи заявки, число заявок в накопителе и т.д.). На схеме условно обозначены:
51266. Система тонких линз и определение их основных характеристик 91 KB
  Определение фокусных расстояний собирающей и рассеивающей линз и основных характеристик оптических систем составленных из этих линз. Приборы и принадлежности: источник света со щелью в виде стрелки; экран; рейтер и масштабная линейка; набор линз две собирающих и одна рассеивающая; два штатива для установки линз. Теоретические сведения Оптическая сила линзы D – величина обратная фокусному расстоянию.