Lab cpp 09


Laboratorium nr 9
Temat: Funkcje zaprzyjaznione, funkcje inline oraz argumenty domyślne funkcji.
1. Koncepcja funkcje zaprzyjaznionych oraz inline w C++
Funkcje zaprzyjaznione: w przypadku istnienie w deklaracji klasy zmiennych typu private, dostęp
do nich jest ograniczony do danego obiektu, wynika to z faktu, że w C++ jednostką chronioną przed
niepowołanym dostępem jest klasa, a nie obiekt. Oznacza to, że funkcja składowa danej klasy może
używać wszystkich składowych prywatnych dowolnego obiektu tej samej klasy. Natomiast do
składowych prywatnych jakiegoś obiektu nie ma dostępu funkcja innej klasy, ani jakakolwiek funkcja
niezależna. Rozwiązaniem tego problemu jest zastosowanie funkcji zaprzyjaznionych. Funkcja
zaprzyjazniona posiada dostęp do prywatnych danych obiektu lub obiektów danej klasy. Deklaracja:
class klasa {
private:
typ dana;
public:
&
friend typ funkcja (np. const class klasa &); ! argumentem funkcji będzie najczęściej
} referencja do obiektu danej klasy
Funkcje inline: celem tych funkcji jest przyspieszenie działania programu. Wywołania funkcje inline w
programie są zastępowane w czasie kompilacji pełnym kodem funkcji, tzn. zostaje ona rozwinięta do
pełnej zawartości funkcji. Podejście takie, zaoszczędza czas na obsługę wywołania funkcji, tzn. nie jest
potrzebny kod umieszczenia wartości na stosie, wywołania funkcji, pobrania parametru ze stosu i
zakończenia działania funkcji. Deklaracja:
class klasa {
private:
&
public:
&
int funkcja (& );
}
inline typ klasa::funkcja {
&
}
# include
# include
# include
# include
# include
# include ;
using namespace std;
class macierz {
private:
char nazwa[8];
float *tab;
public:
int x,y;
void wyswietl();
float wartosc(int n, int m);
inline void wprowadz(int n, int m, float w);
friend int dodaj(const class macierz &, const class macierz &);
macierz(int n=0, int m=0, char *nzw=""); //! deklaracja argumentów domy lnych
~macierz();
};
void macierz::wyswietl(){
cout << "\nMacierz:" << nazwa << endl;
for (int i=0; i for (int j=0; j cout <<"\n";
};
};
float macierz::wartosc(int n, int m){
return *(tab+y*n+m);
};
void macierz::wprowadz (int n, int m, float w) {
*(tab+y*n+m)=sqrt(w);
};
macierz::macierz(int n, int m, char *nzw){
x=n;
y=m;
strcpy(nazwa,nzw);
tab=new float[n*m];
for (int i=0; i for (int j=0; j *(tab+y*i+j)=0.0;
}
macierz::~macierz(){
delete[] tab;
};
int dodaj(const class macierz &m1, const class macierz &m2){
class macierz tmp(m1.x,m1.y,"suma");
for (int i=0; i for (int j=0; j *(tmp.tab+tmp.y*i+j)=*(m1.tab+m1.y*i+j)+*(m2.tab+m2.y*i+j);
tmp.wyswietl();
return 0;
};
int main() {
clock_t poczatek,koniec;
class macierz *A[2];
int wymiar=6;
A[0]=new macierz(wymiar,wymiar,"A1");
A[1]=new macierz(wymiar,wymiar,"A2");
poczatek = clock();
for(int i=0;i for(int j=0;j A[0]->wprowadz(i,j, rand());
A[1]->wprowadz(i,j, rand());
}
A[0]->wyswietl();
A[1]->wyswietl();
koniec=clock();
dodaj(*A[0],*A[1]);
cout << "\nCzas=" << (float) (koniec-poczatek)/CLK_TCK;
getch();
delete[] A;
return 0;
}
2. Zadanie:
Zmodyfikuj powyższy program tak, aby umożliwiał deklaracje szeregu macierzy o dowolnych
wymiarach oraz podstawowe działania na macierzach (dodawanie, mnożenie, transpozycja, itp.) w
oparciu o funkcji zaprzyjaznione dla klasy macierz.
Uwaga: Program powinien składać się z oddzielnych plików, tzn. pliku głównego oraz plików
zdefiniowanych klas, itp.
Program powinien posiadać krótkie menu wyboru, np.:
1. Utwórz macierz
2. Wyświetl macierz
3. Wypełnij macierz  dane losowe
4. Dodaj
5. Pomnóż
6. itp.
7. Koniec


Wyszukiwarka

Podobne podstrony:
Lab cpp
Lab cpp
Lab cpp
Lab cpp
Lab cpp
Lab cpp
Lab cpp
Lab cpp
Lab cpp
Lab cpp
Lab cpp
Lab cpp
lab 2
T2 Skrypt do lab OU Rozdział 6 Wiercenie 3
IE RS lab 9 overview
lab pkm 3
CPP (2)
lab chemia korozja

więcej podobnych podstron