Programar em C++/Friend: diferenças entre revisões
[edição não verificada] | [edição não verificada] |
Sem resumo de edição |
Sem resumo de edição |
||
Linha 145: | Linha 145: | ||
* '''Não há a propriedade de reversão'''. O facto de uma função ou classe ser friend de uma classe não implica o contrário.ou seja Se numa class A for declarado que a class B é friend. Isto não implica que vai estar declarado na Class B que a class A é friend |
* '''Não há a propriedade de reversão'''. O facto de uma função ou classe ser friend de uma classe não implica o contrário.ou seja Se numa class A for declarado que a class B é friend. Isto não implica que vai estar declarado na Class B que a class A é friend |
||
* Outra propriedade é que '''não há transitividade'''. Se numa class A for declarado que a class B é friend. E depois que na classe B estiver declarado que a classe C é friend de B,…Isto não implica que A seja friend de C. |
* Outra propriedade é que '''não há transitividade'''. Se numa class A for declarado que a class B é friend. E depois que na classe B estiver declarado que a classe C é friend de B,…Isto não implica que A seja friend de C. |
||
---- |
|||
<div id="naveg" style="background-color: #ffffff; border: solid 0px black; padding-left: |
|||
15px; padding-right: 15px; margin: 4px; text-align: left; font-size: 100%"> |
|||
[[Programar em C++ |Indice]] |
|||
[[Programar em C++: Introdução|Introdução]] |
|||
[[Programar em C++: Compilação|Compilação]] |
|||
[[Programar em C++: 1º programa|1º programa]] |
|||
[[Programar em C++: Tipologia de dados|Tipologia de dados]] |
|||
[[Programar em C++: Variáveis|Variáveis]] |
|||
[[Programar em C++: Operadores|Operadores]] |
|||
[[Programar em C++: In-out|In-out]] |
|||
[[Programar em C++: Constantes|Constantes]] |
|||
[[Programar em C++: Execution Code – control loop jump|Execution Code – control loop jump]] |
|||
[[Programar em C++: Functions|Functions]] |
|||
[[Programar em C++: Arrays|Arrays]] |
|||
[[Programar em C++: Pointers|Pointers]] |
|||
[[Programar em C++: Dinamic Memory allocation|Dinamic Memory allocation]] |
|||
[[Programar em C++: Strings|Strings]] |
|||
[[Programar em C++: Input –Output|Input –Output]] |
|||
[[Programar em C++: Enumerations|Enumerations]] |
|||
[[Programar em C++: Structures|Structures]] |
|||
[[Programar em C++: Unions|Unions]] |
|||
[[Programar em C++: Classes|Classes]] |
|||
[[Programar em C++: Friends|Friends]] |
|||
[[Programar em C++: Operator Overloading|Operator Overloading]] |
|||
[[Programar em C++: Inherence|Inherence]] |
|||
[[Programar em C++: Polymorphism|Polymorphism]] |
|||
[[Programar em C++: Virtual Members|Virtual Members]] |
|||
[[Programar em C++: Templates|Templates]] |
|||
[[Programar em C++: Exceptions|Exceptions]] |
|||
[[Programar em C++: Namespaces|Namespaces]] |
|||
[[Programar em C++: STL-Standard Template Library|STL-Standard Template Library]] |
|||
</div> |
|||
---- |
Revisão das 14h35min de 13 de junho de 2006
Friend functions
O que é
Declarando que uma função (externa á classe) friend dentro de uma classe, permite que a função (a amiga) possa aceder a membros (variáveis e funções membro) private e protected (e claro public mas isso já era permitido antes de serem friends). Coisa que as outras funções não podem.
Declarar friend functions
Para isto acontecer apenas temos de colocar o protótipo da função externa dentro da classe e colocando antes a palavra friend. Vamos ao exemplo:
// friend functions #include <iostream> using namespace std; class CRectangle { int width, height; public: void set_values (int, int); int area () {return (width * height);} friend CRectangle duplicate (CRectangle); }; void CRectangle::set_values (int a, int b) { width = a; height = b; } CRectangle duplicate (CRectangle rectparam) { CRectangle rectres; rectres.width = rectparam.width*2; rectres.height = rectparam.height*2; return (rectres); } int main () { CRectangle rect, rectb; rect.set_values (2,3); rectb = duplicate (rect); cout << rectb.area(); system (“pause”); return 0; }
Aconselham o não uso dos friends
Class name CRectangle | private | public | |||
int width | int height | void set_values (int, int) | int area () | friend CRectangle duplicate | |
rect | |||||
rectb |
Friend classes
Aqui o caso é igual ás friend functions só que agora temos o caso de ter uma segunda classe que tem acesso a membros privados e protegidos de uma dada classe.
Compreender bem a difereça entre friend functions e friend classes!!!! há bastantes pessoas que não apanham bem isto
// friend class #include <iostream> using namespace std; class CSquare; class CRectangle { int width, height; public: int area () {return (width * height);} void convert (CSquare a); //consigo aceder porque é friend }; class CSquare { private: int side; public: void set_side (int a) {side=a;} friend class CRectangle; //declaro friend class }; void CRectangle::convert (CSquare a) { width = a.side; height = a.side; } int main () { CSquare sqr; CRectangle rect; sqr.set_side(4); rect.convert(sqr); cout << rect.area(); system (“pause”); return 0; }
Nota:
- Não há a propriedade de reversão. O facto de uma função ou classe ser friend de uma classe não implica o contrário.ou seja Se numa class A for declarado que a class B é friend. Isto não implica que vai estar declarado na Class B que a class A é friend
- Outra propriedade é que não há transitividade. Se numa class A for declarado que a class B é friend. E depois que na classe B estiver declarado que a classe C é friend de B,…Isto não implica que A seja friend de C.