background image

Laboratorium nr 13

Temat:  Przeciążanie operatorów, funkcje i zmienne statyczne. Algorytm sortowania. 

1. Koncepcja przeciążania operatorów w C++

W C++ można przeciążać istniejące operatory, to znaczy nadawać im nowe znaczenie dla operacji

wykonywanych częściowo lub w całości na obiektach typu klasa. Aby przeciążyć  operator, np. „+”, 
definiuje się funkcje o nazwie operator +, przy czym funkcje te muszą być funkcjami składowymi albo 
zaprzyjaźnionymi   z   obiektami,   na   których   działają.   W   C++   można   przeciążać  zarówno   operatory 
jednoargumentowe (np. ++) jak i dwuargumentowe (+). Należy przy tym ograniczyć się do przeciążania 
istniejących operatorów, przy zachowaniu odpowiedniej liczby argumentów. Zwykle funkcja operatora 
zwraca typ obiektu, na którym działa. 

class klasa{

public:
klasa operator +();

}

Uwaga: do funkcji zaprzyjaźnionych nie jest przesyłany wskaźnik this, dlatego operatory te powinny 
być  zadeklarowane jako referencyjne. W takim przypadku przekazywany jest sam obiekt, a nie jego 
kopia.

2. Funkcje i zmienne statyczne

Zmienne  Static:   dana   składowa   zadeklarowane   w   klasie   jako  static  jest   dzielone   przez 
wszystkie obiekty danej klasy. Istnieje nawet wtedy, kiedy nie istnieje żaden obiekt. Domyślną 
wartością jest   zero. Możliwa jest inicjalizacja jawna na zewnątrz klasy (nawet, jeżeli dana jest 
prywatna) przy użyciu operatora zakresu:

private:

static int licznik;

Funkcje  

 

 Static

 

 : jeżeli  jakaś funkcja składowa ma działanie  niezależne od obiektów  swojej 

klasy, można ją zadeklarować z atrybutem static. Funkcja taka może być następnie wywołana bez 
wymieniania jakiegokolwiek obiektu, a jedynie poprzedzając jej nazwę nazwą klasy i operatorem 
zakresu (::).

3.  Algorytmy sortowania

  Algorytm sortowania umożliwia uporządkowanie zbioru danych względem pewnych cech, np. 

wartości każdego elementu: 

liczby 

słowa 

Algorytmy sortowania dzieli się zazwyczaj na dwie grupy, tj. stabilne i niestabilne: 

stabilne, np.: 

bąbelkowe , tj.

 

  porównywanie dwóch kolejnych elementów i zamiana ich kolejności 

przez wstawianie 

itp.

niestabilne, np.: 

przez wybieranie 

Shella 

itp.

background image

main.cpp

#include "klasa.h"

int main() {

class lista *baza;

  baza=new lista();

  baza->dodaj("Krzys","Nowak","1");

  baza->dodaj("Grzes","Nowak","2");

  baza->dodaj("Filip","Nowak","3");

  baza->dodaj("Adam","Nowak","4");

  baza->dodaj("Jan","Nowak","5");

  baza->wyswietl();

  baza->sortuj();

  baza->wyswietl();

  return 0;

};

klasa.h

#include <iostream>

#include <string.h>

using namespace std;

// klasa rekord

class rekord {

private:

public:

  char imie[10];

  char nazwisko[25];

  char telefon[10];

  class rekord *nastepny;

  rekord(char *i,char *n,char *t);

  rekord();

};

//klasa lista

class lista : public rekord {

private:

  class rekord *pierwszy;

public:

  void wyswietl();

  void dodaj(char *i,char *n,char *t);

  void sortuj();

  lista(char *i="Imie", char 

*n="Nazwisko", char *t="Telefon");

};

klasa.cpp

#include "klasa.h"

rekord::rekord(char *i, char *n, char *t){

  strcpy(imie,i);

  strcpy(nazwisko,n);

  strcpy(telefon,t);

  nastepny=NULL;

};

rekord::rekord(){};

void lista::wyswietl(){

  class rekord *obiekt=this->pierwszy;

  while (obiekt!=NULL) {

    cout<<obiekt->imie<<"\t";

    cout<<obiekt->nazwisko<<"\t";

    cout<<obiekt->telefon<<"\n";

    obiekt=obiekt->nastepny;

  };

};

void lista::dodaj(char *i,char *n,char *t){

  class rekord *obiekt=this->pierwszy;

  while (obiekt->nastepny!=NULL) {

    obiekt=obiekt->nastepny;

  };

  obiekt->nastepny=new rekord;

  strcpy(obiekt->nastepny->imie,i);

  strcpy(obiekt->nastepny->nazwisko,n);

  strcpy(obiekt->nastepny->telefon,t);

  obiekt->nastepny->nastepny=NULL;

};

void lista::sortuj(){

 class rekord *obiekt1,*obiekt2;

 char *i, *n, *t;

 obiekt1=this->pierwszy->nastepny;

 while (obiekt1->nastepny!=NULL){

  obiekt2=this->pierwszy->nastepny;

  while (obiekt2->nastepny!=NULL) {

   if(strcmp((char*)obiekt2->imie,(char*) 

obiekt2->nastepny->imie)==1){

   i=new char [strlen(obiekt2->imie)+1];

   n=new char [strlen(obiekt2->nazwisko)+1];

   t=new char [strlen(obiekt2->telefon)+1];

   strcpy(i,obiekt2->imie);

   strcpy(n,obiekt2->nazwisko);

   strcpy(t,obiekt2->telefon);

   strcpy(obiekt2->imie,obiekt2->nastepny-> 

imie);

   strcpy(obiekt2->nazwisko,obiekt2-> 

nastepny->nazwisko);

   strcpy(obiekt2->telefon,obiekt2-> 

nastepny->telefon);

   strcpy(obiekt2->nastepny->imie,i);

   strcpy(obiekt2->nastepny->nazwisko,n);

   strcpy(obiekt2->nastepny->telefon,t);

   };

   obiekt2=obiekt2->nastepny;

  };

  obiekt1=obiekt1->nastepny;

  };

};

lista::lista(char *i, char *n, char *t) : 

rekord(i,n,t){

  this->pierwszy=this;

};

4.  Zadanie:  Zmodyfikuj program bazy danych z poprzednich ćwiczeń tak, aby umożliwiał sortowanie 
rekordów po dowolnie wybranym polu oraz w wybranej kolejności, tzn. rosnąco lub malejąco.