Laboratorium nr 9
Temat: Funkcje zaprzyja nione, funkcje inline oraz argumenty domy lne funkcji.
1. Koncepcja funkcje zaprzyja nionych oraz inline w C++
Funkcje zaprzyja nione: 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 zaprzyja nionych. Funkcja
zaprzyja niona 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 <conio.h>
# include <iostream>
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
# include <math.h>;
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<x; i++) {
for (int j=0; j<y; j++) cout << *(tab+y*i+j) << "\t";
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<n; i++)
for (int j=0; j<m; 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<tmp.x; i++)
for (int j=0; j<tmp.y; 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<wymiar;i++)
for(int j=0;j<wymiar;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 zaprzyja nione 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