- •Модификатор const: неизменяемые поля класса. Список инициализации.
- •Пример реализации двусвязного списка с помощью классов.
- •8) Закрытые конструкторы (статический метод - "фабрика" объектов класса).
- •Несколько замечаний по виртуальным функциям:
- •23) Абстрактные классы в Java. Абстрактные классы в с#.
- •24) Интерфейсы в Java.
- •26) Виртуальные базовые классы.
- •27) Наследование реализации.
Главные признаки объектно-ориентированного подхода (Alan Kay).
В прогр. всё явл. объектом.
Вычисления имеют вид взаимодействия объектов.
Каждый объект имеет собств. область памяти.
Каждый объект является представителем класса.
Поведение объекта определяется классом.
Классы образуют единую древовидную структуру с общим корнем, называемой иерархией наследования.
Общеязыковые расширения C++: значения аргументов функции по умолчанию, комментарии, ссылки, встраиваемые (подставляемые) функции, операция разрешения области видимости.
- значения аргументов функции по умолчанию
void f(int a, double b=1.5);
int main(){ f(1,5.5);
f(-10); // = f(-10, 1.5);
Все аргументы расположенные справа от «по умолчанию» должны быть по умолчанию
- комментарии // строка , /* много строк */
- ccылки int x=2; int &r=x; int y=4; r=y; // x=4; ccылка – скрытый указатель.
- встраиваемые функции: inline f(); - попытка оптимизировать работу программы
- операция разрешения области видимости. int x=1; int main(){int x=2; printf(“%d”,x);}//::x
Перегрузка функций. Механизм реализации перегрузки функций. Спецификация внешней связи.
В С++ можно одновременно задавать несколько функций с одним и тем же именем, если различаются списки их аргументов.
void f();
void f(int,double); Нельзя иметь фунции, отличающ. только типом возвр. знач.
void f(double,int);
Механизм реализации перегрузки функций: Компилятор искажает заданные нами имена, добавляя информацию о типах аргументов функции. Искажение не стандартизировано.
Спецификация внешней связи. Компилятор Си не искажает имя функции, а компилятор С++ искажает и ожидает другое имя. Конструкция, запрещающая С++ искажать имена exturn “C”{void f();} или #include “f.h”.
4) Специальные методы класса. Конструкторы. Деструктор. Конструктор копирования. Операция присваивания. Конструкторы преобразования и методы приведения типа. Операции new и delete для класса. Модификатор const: неизменяемые поля класса. Список инициализации.
Специальные методы класса. – методы обеспеч. общее функцианирование любых классов.
Конструкторы – вызываются при создании нового обьекта. Задача – инициализация обьекта, т.е. дать нач. знач. для всех его полей. -Имя констр. совпадает с именем класса.
-Не задается тип возвр. значения. -М.б. перегружен. -Не наследуются –Не м.б. виртуальной функцией. class A{ public: int a; A(){a=0;}; A(int x){a=x;}}
E сли нет конструкт.-’’конструктор по умолчанию''
int main(){ A x, y(10);}
Деструкторы - вызывается перед уничтожением любого обьекта. При выходе обьекта из области видимости вызывается деструктор. ~ <имя класса>(){}; Для класса м.б. вызван только 1 деструктор. Если деструктор явно не созд. - его создает компилятор.
Конструктор копирования – вызывается если созданный обьект должен быть копией уже существующ. обьекта того же класса. –Конструктор с одним аргументом, ссылкой на обьект своего класса. class A{ int a; A(){a=0;}; A(A& x){a=x.a;};
Операция присваивания A operator = (A a2){ a1=a2; // = a1.operator=(a2);}
Конструкторы преобразования. – используется для того чтобы объект чужого класса превратить в объект нашего класса. К.п. – это констр. с 1им аргументом. Тип аргумента-чужой тип, который. преобраз. в объект нашего класса. Class A{ int a; A(int x=0)!!!{a=х};}
void f(A x); int main(){ f(5); A x(10); - разрешено т.к. есть преобразование. !!!
Приведе́ние ти́па — преобразование значения переменной одного типа в значение другого типа. int X; int Y = 200; char C = 30;
X = (int)C * 10 + Y; //переменная С приведена к типу int.
Операции new и delete для класса - Если для класса явно не заданы, то можно исп. стандартные версии: new:-выделяет память в куче,-вызывает конструктор
delete:-освобождает память,-вызов деструктора
void *operator new(int size){return malloc(size);}
void operator delete(void *p){free(p);}
Модификатор const: неизменяемые поля класса. Список инициализации.
const int a2; Константы получают своё значение в списке инициализации
A(int a2=10){…}; конструктора. Ссылка в С++ ведет себя как константный указатель, поэтому поля ссылки должны быть проинициализированы в списке инициализации конструктора.
Константные объекты класса. Константные методы. Ключевое слово mutable. Пример реализации двусвязного списка с помощью классов.
Для константных объектов запрещен вызов не константных методов класса. Константный метод в общем случае не может изменять значение полей класса. Константные методы можно вызывать для неконстантных объектов класса. class A{int a;
int getA() const{return a;}}
mutable int a; -отмечает те поля, знач которых int main() { const A x;
можно изменять в константных методах. int x=getA();}
Пример реализации двусвязного списка с помощью классов.
list.h
сlass List{struct Node{ int key;
char *data;
Node *prev,*next;}
public: List();
~List();
List(List&);//констр. копиров.
List & operator=(List&);
void add(int key,char *data);
void delNode(int key);
void*find(int key);
void show();
void delllist();
private: Note*findNode(int key);
В открытой части List, нигде не используется
класс Node
list.cpp
#include “list.h”
#include “iostream”
using namespace std;
List::List(){first=0;}
List::~List(){delist();}
int List::Node::findNode(int key){Node*tmp=first;
while(tmp){if(tmp->key==key) return key;
tmp=tmp->next}
return 0;}
void List::show(){Node *tmp=first;
while(tmp){cout<<tmp->key<<” . “ <<tmp->data<<endl;}
tmp=tmp->netx;}
Статические поля и методы класса.
class A
{public: static int i;}
/* Обязательно нужно проинициализировать */
int A::i = 0;
int main(){
A::i = 1;}
Статические методы не привязаны к объектам класса, за счет того, что им не пережается скрытый указатель this. Поэтому статические методы можно вызывать даже если нет ни одного объекта класса. В статических методах из-за отсутствия this нет возможности на прямую обращатся к нестатическим полям и методам класса. Если поле объявлено статич., оно ведет себя как внешняя переменная. Размещается в сегменте данных и существует в единств. экземпляре, независимо от того сколько задано обьектов. Статическое поле существует даже если нет обьектов. Статич. поле по умолчанию обнуляется.
7)Общая структура программы на C++. Общая структура программы на Java. Общая структура программы на С#.
Программа на языке С++ представляет собой набор функций. Одна из функций должна иметь имя main. Операционная система передает управление в программу пользователя на функцию с этим именем и тем самым начинается выполнение программы. От функций в программе функция main отличается тем, что ее нельзя вызвать изнутри программы, а ее параметры, если они существуют, обычно задаются ОС, хотя это необязательно, main бывает первой функцией в тексте программы. main ( ) { ... return 0; } Если предположить, что main- первая функция, определенная в программе на языке С++, то поскольку ни одна функция не может содержать определения другой функции, следом в тексте будут располагаться определения вспомогатель-ных функций, «неглавных» функций. Их может быть различное количество. Функции могут быть описаны в произвольном порядке.
main ( ) { ... return 0;} function 1 ( ) { }
------- Программа на языке C# может состоять из одного или нескольких файлов. Каждый файл может содержать ноль или более пространств имен. Пространство имен может включать такие элементы, как классы, структуры, интерфейсы, перечисления и делегаты, а также другие пространства имен. Ниже приведена скелетная структура программы C#, содержащая все указанные элементы.
C#
using System; // A skeleton of a C# program
namespace YourNamespace{}
class YourClass{}
struct YourStruct{}
interface IYourInterface {}
delegate int YourDelegate();
enum YourEnum {}
namespace YourNestedNamespace{
struct YourStruct {}
}
class YourMainClass
{
static void Main(string[] args)
{
//Your program starts here...
}}}
7) Java
import java.lang – аналог using namespace std в С++
import java.lang.* - все имена
import java.lang.system – Виден только system
Public class Hello{
public static void main(String[]args){
System.out.println(“Hello from java”);} }
java.lang – подключается автоматически.
private, public, protected- доступ из др. пакетов, default – доступ на уровне пакета.
Если class public, то его обьявление должно хранится в файле, имя которого совпадает с именем класса (class hello -> hello.java).
Точка входа в прогр. main, должна быть открытым public static void main
Метод main выполняется, когда еще нет ни одного объекта какого либо класса->static
У метода main всегда один аргумент- массив строк-те аргументы которые могут передав. при запуске из командной строки main(String[]args), args – ссылка на объект класса массив строк. В java у любого класса м.б. метод main, поэтому м.б. много точек входа.