МегаПредмет

ПОЗНАВАТЕЛЬНОЕ

Сила воли ведет к действию, а позитивные действия формируют позитивное отношение


Как определить диапазон голоса - ваш вокал


Игровые автоматы с быстрым выводом


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


Целительная привычка


Как самому избавиться от обидчивости


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


Тренинг уверенности в себе


Вкуснейший "Салат из свеклы с чесноком"


Натюрморт и его изобразительные возможности


Применение, как принимать мумие? Мумие для волос, лица, при переломах, при кровотечении и т.д.


Как научиться брать на себя ответственность


Зачем нужны границы в отношениях с детьми?


Световозвращающие элементы на детской одежде


Как победить свой возраст? Восемь уникальных способов, которые помогут достичь долголетия


Как слышать голос Бога


Классификация ожирения по ИМТ (ВОЗ)


Глава 3. Завет мужчины с женщиной


Оси и плоскости тела человека


Оси и плоскости тела человека - Тело человека состоит из определенных топографических частей и участков, в которых расположены органы, мышцы, сосуды, нервы и т.д.


Отёска стен и прирубка косяков Отёска стен и прирубка косяков - Когда на доме не достаёт окон и дверей, красивое высокое крыльцо ещё только в воображении, приходится подниматься с улицы в дом по трапу.


Дифференциальные уравнения второго порядка (модель рынка с прогнозируемыми ценами) Дифференциальные уравнения второго порядка (модель рынка с прогнозируемыми ценами) - В простых моделях рынка спрос и предложение обычно полагают зависящими только от текущей цены на товар.

Определение структурного типа





Для определения структурного типа используется ключевое слово struct:
struct имя_структурного_типа
{ описание поля1;
. . .

описание поляn;
} [одна или более переменных];


При определении структурной переменной язык C++ резервирует для нее место в памяти. Если же был описан только структурный тип, а ни одной переменной данного типа определено не было, то место в памяти не выделяется.
Инициализация переменной структурного типа
Переменную структурного типа можно инициализировать одновременно с объявлением. Инициализация переменной структурного типа производится, если после имени типа следуют знак "=" и список значений полей структурного типа в фигурных скобках разделенные запятой.

Значения переменным-полям присваиваются в порядке их объявления при определении структурного типа.

Доступ к значениям полей структурного типа
Доступ к значениям полей структурного типа осуществляется с помощью операции точка.

Общий вид:
Имя_переменной_структурного_типа . имя_поля


Вложенные структурные типы

Язык C++ позволяет определять один структурный тип в рамках другого. Например, структурный тип PersonInfo для записи роста, веса и даты рождения человека может быть определен, как показано в примере 8.5.

Пример объявления переменной person типа PersonInfo:

PersonInfo person;

Чтобы получить доступ к значению поля birthday - переменной структурного типа PersonInfo, нужно использовать операцию точка: person.birthday, но так как birthday в свою очередь является полем структурного типа Date, то доступ, например, к году рождения осуществляется добавлением операции точка с именем year: person.birthday.year

Массивы структурного типа
Массивы структурного типа определяются так же, как и массивы стандартных типов.
Общий вид:
Имя_структурного_типа имя_переменной [количество_элементов_массива];
Например: PersonInfo personal[20];
Нумерация элементов массива начинается с нулевой компоненты и заканчивается индексом, равным количеству элементов массива минус 1.
Доступ к элементам массива структурного типа также осуществляется с использованием операции точка,

 

2 Разница между статическими и нестатическими членами класса

 

Статический класс в основном такой же, как и нестатический класс, но имеется одно отличие: нельзя создавать экземпляры статического класса. Другими словами, нельзя использовать ключевое слово new для создания переменной типа класса.Поскольку нет переменной экземпляра, доступ к членам статического класса осуществляется с использованием самого имени класса.Например, если имеется статический класс, называемый UtilityClass, имеющий открытый метод, называемый MethodA, вызов метода выполняется, как показано в следующем примере.

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



Более типично объявлять нестатический класс с несколькими статическими членами, чем объявлять весь класс как статический.Статические поля обычно используются для следующих двух целей: хранение счетчика числа созданных объектов, или хранение значения, которое должно совместно использоваться всеми экземплярами.

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

Хотя поле, не может быть объявлено как static const, поле const по своему поведению является статическим.Оно относится к типу, а не к экземплярам типа. Поэтому к полям const можно обращаться с использованием той же нотации ClassName.MemberName, что используется для статических полей. Экземпляр объекта не требуется.

В С++ члены класса классифицируются в соответствии с правами доступа на следующие три кате­гории: публичные (public), частные (private) и защищенные (protected). Любая функция програм­мы имеет доступ к публичным членам. Доступ к частному члену имеют только функции-члены класса или функции-друзья класса. Защищенные члены аналогичны частным членам. Разница между ними появляется только при наследовании классов.

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

Например:

class X {
protected:
int i;
int j;
public:
void get_ij();
void put_ij();
};
class Y: public X {
int k;
public:
int get_k();
void make_k();
};

class my_class {
protected:
int i;
int j;
public:
void f1();
void f2();
protected:
int a;
public:
int b;
};

class X {
int i;
int j;
public:
void get_ij();
void put_ij();
};
class Y: public X {
int k;
public:
int get_k();
void make_k();
};

 

3 Спецификаторы доступа к членам класса в языке С++

Управление доступом к членам

Тип доступа Назначение
private Члены класса, объявленные как private, могут использоваться только функциями-членами и дружественными функциями (классы и функции) класса.
protected Члены класса, объявленные как protected, могут использоваться функциями-членами и дружественными функциями (классы и функции) класса. Кроме того, они могут использоваться производными классами данного класса.
public Члены класса, объявленные как public, могут использоваться любой функцией.

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

· Объявляется ли базовый класс производным классом с помощью спецификатора открытого доступа в заголовке-класса (описаниезаголовка-класса см. в подразделе "Грамматика" раздела Определение типов классов).

· Какой доступ к членам предоставляется в базовом классе.

В следующей таблице показана взаимосвязь между этими факторами и определен доступ к членам в базовом классе.

Доступ к членам в базовом классе

private protected public
Всегда отсутствует независимо от доступа при наследовании Закрытый в производном классе при использовании закрытого наследования Закрытый в производном классе при использовании закрытого наследования
  Защищенный в производном классе при использовании защищенного наследования Защищенный в производном классе при использовании защищенного наследования
  Защищенный в производном классе при использовании открытого наследования Открытый в производном классе при использовании открытого наследования

4. Понятие чистой виртуальной функции в языке С++

 

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

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

Этот механизм делает производные классы и виртуальные функции ключевыми понятиями при разработке программ на С++. Базовый класс определяет интерфейс, для которого производные классы обеспечивают набор реализаций. Указатель на объект класса может передаваться в контекст, где известен интерфейс, определённый одним из его базовых классов, но этот производный класс неизвестен. Механизм виртуальных функций гарантирует, что этот объект всё равно будет обрабатываться функциями, определёнными для него, а не для базового класса.

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

Виртуальная функция (virtual function) объявляется внутри базового класса и переопределяется в производном классе. По существу, виртуальная функция реализует идею «один интерфейс, множество методов», которая лежит в основе полиморфизма. Виртуальная функция внутри базового класса определяет вид интерфейса этой функции. Каждое переопределение виртуальной функции в производном классе определяет ее реализацию, связанную со спецификой производного класса.

Таким образом, переопределение создает конкретный метод.

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

 

#include <iostream.h>

class Base

{public:

int i;

Base(int x){i=x;}

virtual void func()

{cout<<”Выполнение функции func() базового класса:”;

cout<<i<<endl;

}

};

class Der1: public Base

{public:

Der1(int x): Base(x) {}

void func()

{cout<<” Выполнение функции func() класса Der1:”;

cout<<i*i<<endl;

}

};

class Der2: public Base

{public:

Der2 (int x): Base(x) {}

//функция func() не подменяется

};

int main(void)

{ Base *p;

Base obj(10);

Der1 d1_obj(10);

Der2 d2_obj(10);

p=&obj;

p->func(); //функция func() базового класса

p=&d1_obj;

p->func(); //функция func() производного класса Der1

p=&d2_obj;

p->func(); //функций func() базового класса

return 0;

}

 

5. Что такое инкапсуляция? Основная цель использования инкапсуляции.

 

Инкапсуляция (encapsulation) - это механизм, который объединяет данные и код, манипулирующий зтими данными, а также защищает и то, и другое от внешнего вмешательства или неправильного использования. В объектно-ориентированном программировании код и данные могут быть объединены вместе; в этом случае говорят, что создаётся так называемый "чёрный ящик". Когда коды и данные объединяются таким способом, создаётся объект (object). Другими словами, объект - это то, что поддерживает инкапсуляцию.

Внутри объекта коды и данные могут быть закрытыми (private). Закрытые коды или данные доступны только для других частей этого объекта. Таким образом, закрытые коды и данные недоступны для тех частей программы, которые существуют вне объекта. Если коды и данные являются открытыми, то, несмотря на то, что они заданы внутри объекта, они доступны и для других частей программы. Характерной является ситуация, когда открытая часть объекта используется для того, чтобы обеспечить контролируемый интерфейс закрытых элементов объекта.

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

class A{ public: int a, b; //данные открытого интерфейса int ReturnSomething(); //метод открытого интерфейса private: int Aa, Ab; //скрытые данные void Do_Something(); //скрытый метод};

 

6. Что такое полиморфизм? Как реализуется полиморфизм. Ранее и позднее связывание. Что такое интерфейс и как полиморфизм позволяет реализовать интерфейсы.

 

Полиморфизм (polymorphism) (от греческого polymorphos) - это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач. Целью полиморфизма, применительно к объектно-ориентированному программированию, является использование одного имени для задания общих для класса действий. Выполнение каждого конкретного действия будет определяться типом данных. Например для языка Си, в котором полиморфизм поддерживается недостаточно, нахождение абсолютной величины числа требует трёх различных функций: abs(), labs() и fabs(). Эти функции подсчитывают и возвращают абсолютную величину целых, длинных целых и чисел с плавающей точкой соответственно. В С++ каждая из этих функций может быть названа abs(). Тип данных, который используется при вызове функции, определяет, какая конкретная версия функции действительно выполняется. В С++ можно использовать одно имя функции для множества различных действий. Это называется перегрузкой функций (function overloading).

В более общем смысле, концепцией полиморфизма является идея "один интерфейс, множество методов". Это означает, что можно создать общий интерфейс для группы близких по смыслу действий. Преимуществом полиморфизма является то, что он помогает мнижать сложность программ, разрешая использование того же интерфейса для задания единого класса действий. Выбор же конкретного действия, в зависимости от ситуации, возлагается на компилятор. Вам, как программисту, не нужно делать этот выбор самому. Нужно только помнить и использовать общий интерфейс. Пример из предыдущего абзаца показывает, как, имея три имени для функции определения абсолютной величины числа вместо одного, обычная задача становится более сложной, чем это действительно необходимо.

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

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

Интерфе́йс (от лат. inter — «между», и face — «поверхность») — синтаксическая конструкция в коде программы, используемая для специфицирования услуг, предоставляемых классом или компонентом.

Интерфейс определяет границу взаимодействия между классами или компонентами, специфицируя определенную абстракцию, которую осуществляет реализующая сторона. В отличие от концепции интерфейсов во многих других областях, интерфейс в ООП является строго формализованным элементом объектно-ориентированного языка и широко используется кодом программы.

Интерфейсы позволяют наладить множественное наследование объектов и в то же время решить проблему ромбовидного наследования. В языке C++ она решается через наследование классов с использованием ключевого слова virtual.

 

 





©2015 www.megapredmet.ru Все права принадлежат авторам размещенных материалов.