Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Перегрузка операция сложения




Пример реализации двусвязного списка с помощью классов.

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;}

 

 

6) Статические поля и методы класса.

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, поэтому м.б. много точек входа.

 

 


8) Закрытые конструк­торы (статический метод - "фабрика" объектов класса).

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

class NLog{// Private Constructor: private NLog() { } public static double e = Math.E; //2.71828...}

Закрытые конструкторы используются, чтобы не допустить создание экземпляров класса при отсутствии полей или методов экземпляра, например для класса Math, или когда осуществляется вызов метода для получения экземпляра класса. Если все методы в классе являются статическими, имеет смысл сделать статическим весь класс.

" фабрика" объектов класса

class A{ int a;

A(){a=0;} static A*create();

~A(){} static void destroy(*A);

public: int getA(){return a;}

int seta(int x){a=x;}

int main { A a; // в функции main нельзя вызвать конструктор А

Если конструкторы закрытые, то можно создать открытый метод класса.

A *p; p=A::create(); A::destroy(p);

 

9) Друзья класса. Закрытые конструкторы ("фабрика" объектов класса - внешняя функция - друг класса)

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

("фабрика" объектов класса - внешняя функция - друг класса

class A{int a;

friend void f(); Если класс А друг В, то не значит что В друг А.

friend A* create(); Если А друг В, В друг С, А не друг С.

friend void destroy(A*);}

void f(){…}

int main(){f();

A *p; p=A::create(); A::destroy(p);}
10) Перегрузка операций. Пример: операция сложения. Когда операцию нельзя перегрузить как метод класса. Операция помеще­ния в поток.

 

В С++ в общем случае операцию можно перегрузить с помощью не статического метода класса, либо с помощью внешней функции.

Особенности перегрузки операций в С++:

- нельзя перегружать операции для стандартных типов, только для собственных классов.

- нельзя придумать собственный значок операции.

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

- нельзя перегружать след. операции:: (Разрешение области видимости), sizeof,?: (Условный оператор сравнения),. (Выбор элемента),.* (Указатель на элемент).

- операции =, [], (), -> могут перегружаться только с помощью метода класса.

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

- перегруженные операции, кроме присваивания, наследуются.

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

Перегрузка операция сложения

Class A{ int a;

public: A(int x=0): a(){}

int getA(){return 0;}

void setA(int x){a=x;}

A operator+(A a2){return A(a+a2.a);}

A operator+(int x){return A(a+x);}

int main(){ A a1(2), a2(4), a3;

a3=a1+a2; // a3=a1.operator+(a2);

a3=a1+10; // преобразование конструктором преобразования

return 0;}

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

Операция помеще­ния в поток.

cout << a << endl

Class A{ int a;

friend ostream& operator<<(ostream& o, A a); }

Т.к. операция помещения в поток вв качестве своего первого аргумента использует обьект некоторого стандартного класса. Её нельзя переопределить как метод нашего класса. Можно только с помощью внешней ф-ии, обычно друж. функции.

ostream&.operator<<(ostream& o, A a){return o<<a;}
11) Пространства имен в Си. Пространства имен в C++. Вложенные пространства имен. Безымянные пространства имен. Псевдонимы для пространств имен, using директива и using-объявление.

Пространства имен – средства для избежания конфликта имен.

В СИ 4 пространства имен: (1) Тэги (2) Имена полей

(3)Имена переменных, функций, типов (4)Содержит метки.

Struct (1)Student { char (2)Student[20];}

(3)Student;

int m; goto m; (4)m:a=x;}

В С++ можно создавать собственные пространства имен.

namespace lib1{ namespace lib2{

void draw(){} } void draw(){} }

int main(){ lib1::draw(); lib2::draw();}

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...