Eu tenho uma programação orientada a objetos com o curso c ++ neste semestre na faculdade e estávamos aprendendo sobre funções de amigos.
Eu os detesto instintivamente por sua capacidade de ignorar a segurança que o encapsulamento e a ocultação de dados fornecem, li alguns artigos na internet e algumas pessoas pensaram que era uma boa idéia com alguns usos legítimos.
O que um especialista em OOPs diria sobre as funções de amigos em C ++? Devo apenas dar uma olhada nele ou devo aprender mais sobre isso?
c++
object-oriented
friends
Nikhil
fonte
fonte
Respostas:
Nem sempre é conveniente criar todas as funções relacionadas aos membros de uma classe C ++ dessa classe. Por exemplo, imagine uma implementação de álgebra vetorial com multiplicação escalar. Queremos escrever:
Podemos fazer isso com uma função de membro:
Mas também gostaríamos de escrever:
Isso requer uma função livre:
A
friend
palavra-chave foi adicionada ao C ++ para oferecer suporte a esse uso. A função free faz parte da implementação da classe Vector e deve ser declarada no mesmo cabeçalho e implementada no mesmo arquivo de origem.Da mesma forma, podemos usar
friend
para simplificar a implementação de classes fortemente acopladas, como uma coleção e um iterador. Novamente, eu declararia as duas classes no mesmo cabeçalho e as implementaria no mesmo arquivo de origem.fonte
inline Vector operator*(double a, Vector v) { return v*a; }
. Solução canônica de fato.inline Vector operator*(double a, Vector v) { return -v*a; }
e ainda não exija amizade.As funções de amigo não são diferentes das funções de membro em termos de encapsulamento. Eles podem, no entanto, oferecer outras vantagens, como serem mais genéricos, especialmente no que diz respeito aos modelos. Além disso, alguns operadores podem ser especificados apenas como funções livres; portanto, se você deseja que eles tenham acesso de membro, é necessário
friend
.É melhor para
friend
uma única função do que ser forçado a fazer algo que você não quer que seja público. Isso significa que o mundo inteiro pode usá-lo - em vez de apenas uma função.fonte
friend
uma função "privada", como declarada apenas em uma única TU.Se você é apaixonado pelo que faz, aprenderia tudo sobre C ++. Aprenda para que são usados, como usá-los e depois - e somente então - decida não usá-los. No mínimo, você estará preparado ao ler o código de outra pessoa que usa essa faceta do C ++.
fonte
" O que diria um especialista em OOPs ... " Depende principalmente de como ele é especialista em C ++, que - por sua própria especificação - não é (e não quer ser) uma linguagem para puristas.
OOP Os fanáticos não usam C ++ (eles preferem Smalltalk e gostam de Java).
Os zelots de programação funcional não usam C ++ (eles preferem LISP e seus sucessores)
A maioria dos especialistas em OOP não gosta da função de amigos simplesmente porque deseja que a parte OOP do C ++ se comporte como Smalltalk. Mas o C ++ não é Smalltalk, e eles nem conseguem entender que um amigo não quebra o encapsulamento , pela simples razão de que uma função não pode ser amiga da sua classe sem que ela queira .
E do ponto de vista da "funcionalidade", entre
a.fn(b)
efn(a,b)
não há diferença (ondefn
está um amigo): as partes envolvidas são as mesmas. Simplesmente, uma sintaxe pode ser mais adequada que outra: se fn é comutativo em relação aa
eb
,fn(a,b)
provavelmente , é mais adequadoa.fn(b)
(onde uma aparência tem um "papel especial" que, de fato, não é).fonte
fonte
O FAQ do C ++ é sucinto:
O FAQ apresenta uma das maneiras mais úteis de pensar em amizade:
Talvez o uso mais comum das funções de amigo esteja sobrecarregando << para E / S.
fonte
As funções de amigo são mais usadas para definições de operador definidas pelo usuário. Eles são úteis em outras situações, mas se você especificar classes de amigos com frequência, poderá estar em um desvio de design (apenas uma boa auto-verificação para usar ao escrever código).
Tenha cuidado com a declaração de "segurança" na pergunta original. Existem modificadores de acesso para impedir que você escreva códigos incorretos por acidente, assim como o compilador. Os modificadores de acesso limitam a interface e servem para comunicar quais funções são importantes para usar a classe (pública e protegida) e quais foram criadas como parte de tornar a classe mais bonita para os mantenedores (privados). Os modificadores não constituem segurança, pois existem muitas maneiras de obter dados privados. Por exemplo, pegue um ponteiro para a classe e seu tamanho e vá pescar.
fonte
As funções de amigo do C ++ estão intimamente relacionadas à seguinte funcionalidade:
Isso significa que eles não possuem esse ponteiro e, portanto, estão fora da classe / objeto. Por outro lado, eles geralmente usam parâmetros que os fazem novamente pertencer à classe. Aqui está um exemplo que esclarece o link:
A única diferença entre funções estáticas e funções de amigo é que uma função de amigo pode usar várias classes.
O uso do mecanismo friend em c ++ requer programadores com cerca de 10 a 15 anos de experiência com a maneira de programação em c ++ e, portanto, inicialmente você deve evitá-lo. É um recurso avançado.
fonte