background image

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

background image

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.  

 

background image

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