Aceste macrouri se pot defini astfel:
# define numem ( Lista_parametri_formali sir_caractere
Apelurile macrourilor se vor inlocui cu sirul de caractere precizat, fara a face verificari de tipuri, ceea ce poate conduce la erori.
Aceste erori pot fi eliminate daca utilizam functiile inline, caz in care se vor face conversiile de tip necesare. Aceste functii se declara prin scrierea cuvantului inline la inceputul antetului, asa cum se pate vedea in exemplele urmatoare:
Ex. 1:
#include <conio.h>; #include <iostream.h>;
#define Abs_G(x) (x)> 0 ? (x) : -(x) // Gresit !
#define Abs_g(x) ( x > 0 ? x : - x ) // gresit !
#define Abs_c(x) ( (x)> 0 ? (x) : -(x) ) // Macro corect
inline long Abs (long x) // Functie Inline
void main (void)
Ex. 2:
#include <iostream.h>;
#define max x, y) (x>y ? x : y) // Gresit !
inline int Max(int x, int y) // F.Inline
void main (void)
// Rezultatele
max(7,3)=7
Max(6,3)=6
Antetul unei functii cu valoare de tip referinta este:
tip & numef ( Lista_parametri_formali
Exemplu:
#include <time.h>; #include <stdlib.h>; #include <conio.h>; #include <iostream.h>;
int & Alba_Neagra ( int & Albe, int & Negre ) // Ref. la int
void main (void)
In urmatorul exemplu se doreste modificarea coordonatelor celui mai apropiat punct (dintre P si Q) fata de origine (nu doar coordonatele simetricului lui P sau Q):
Simetrizeaza cel mai apropiat punct fata de origine
#include <iostream.h>
#include 'crt.h'
struct Punct ;
float D2 ( Punct P )
Punct SimO ( Punct& P )
Punct& ApropO( Punct& P, Punct& Q )
Punct CitP ( )
void TipP ( Punct P )
void main (void)
// Ex. Referinta
#include <iostream.h>; #include 'Crt.Cpp'
void suma (int x,int y,int *z)
void Suma (int x,int y,int &z)
int* max (int& x, int& y)
int& Max (int& x, int& y)
struct Punct ;
Punct Atrib (int x, int y)
Punct sim (Punct P)
Punct& Sim (Punct& P)
Punct* Psim(Punct P)
void Tip (Punct P)
void main (void)
Rezultate:
Dati x,y : 1 5
(x+1)*(y+1) = 12
(x+1)*(y+1) = 12
x,y = 1 5
max(x,y)+1 = 6
x,y = 1 6
Max(x,y)+1 = 7
x,y = 1 7
P(1,7)
P(-1,-7)
P(1,7)
P(-1,-7)
P(-1,-7)
P(x,y)=(1,7)
P(x,y)=(-1,-7)
Aceasta proprietate da posibilitatea utilizarii unor functii avand acelasi nume, dar diferite (inrudite, cu antete diferite).
Exemple:
#include <math.h>; #include <complex.h>; #include <conio.h>; #include <iostream.h>;
double ArcTg (double x)
double ArcTg (double y, double x)
double ArcTg (complex z)
void main (void)
// Roteste un Triunghi in jurul unui Punct
#include 'graf.h'
#include <conio.h>
struct Punct ;
struct Triunghi ;
Punct Init (float x, float y);
Triunghi Init (Punct A, Punct B, Punct C);
void Translat (Punct& P, Punct Q);
void Translat (Triunghi& T, Punct Q);
void Rot (Punct& P, float Alfa, Punct Q);
void Rot (Triunghi& T, float Alfa, Punct Q);
Punct Init (float x, float y) ; return P; }
Triunghi Init (Punct A, Punct B, Punct C)
void Translat (Punct& P, Punct Q)
void Translat (Triunghi& T, Punct Q)
void Rot (Punct& P,Punct Q,float Alfa)
void Rot (Triunghi& T,Punct Q,float Alfa)
void Muta(Punct P)
void Trag(Punct P)
void Des (Punct P)
void Des (Triunghi T)
void main(void)
while ((Rasp=getche())!=Esc);
closegraph();
Parametrii formali pot avea o valoare implicita, daca acestia lipsesc din lista parametrilor actuali, valoare data de o expresie. In lista parametrilor formali, cei cu valoare implicita (initializati) se vor scrie ultimii astfel:
tip nume = expresie
Exemplu:
#include <stdio.h>; #include <conio.h>; #include <iostream.h>;
struct Obiect ;
int ELipsa ()
int Este_Punct (Obiect o)
Obiect Init( float x0=0, float y0=0, float raza=ELipsa() )
Tip ( Obiect o )
main ()
In exemplul care urmeaza se poate vedea cum se pot folosi parametrii impliciti pentru a declara punctul O(0,0), un punct A pe axa Ox, un punct P in plan (IR ), un cerc C (in plan), extremitatile unui segment din spatiu (Q,RIR ), precum si segmentele QR si RO:
#include <stdio.h>;
#include <conio.h>;
#include <iostream.h>;
struct Punct ;
Punct Init( float x0=0, float y0=0, float z0=0 )
void Tip ( Punct P )
struct Segment ;
Segment Init ( Punct A, Punct B = Init() )
return AB;
void Tip (
void main ()
Acestea se declara in cadrul structurii ca finctii inline sau prototipuri (urmand in acest caz descrierea lor cu ajutorul operatorului de rezolutie (: ).
// Simetrizeaza cel mai apropiat punct fata de origine
#include <iostream.h>
#include 'crt.h'
struct Punct
Punct& SimO ()
};
Punct& Punct::CitP ()
void Punct::TipP ()
Punct& ApropO( Punct& P, Punct& Q )
void main (void)
// Simetrizeaza cel mai apropiat punct fata de origine
#include <iostream.h>
#include 'crt.h'
struct Punct
void TipP()
float D2 ()
Punct& SimO();
};
Punct& Punct::SimO()
Punct& ApropO (Punct& P, Punct& Q)
void main (void)
|