Tengo un programa orientado a objetos con un curso de C ++ este semestre en la universidad y aprendimos sobre las funciones de amigos.
Instintivamente, me disgustan por su capacidad de eludir la seguridad que brindan la Encapsulación y la ocultación de datos, leí algunos artículos en Internet y algunas personas pensaron que era una buena idea con algunos usos legítimos.
¿Qué diría un experto en OOP sobre las funciones de amigos en C ++? ¿Debería pasarlo por alto o debería aprender más al respecto?
c++
object-oriented
friends
nikhil
fuente
fuente
Respuestas:
No siempre es conveniente hacer que todas las funciones relacionadas con una clase C ++ sean miembros de esa clase. Por ejemplo, imagine una implementación de álgebra vectorial con multiplicación escalar. Queremos escribir:
Podemos hacer esto con una función miembro:
Pero también nos gustaría escribir:
Esto requiere una función gratuita:
La
friend
palabra clave se agregó a C ++ para admitir este uso. La función libre es parte de la implementación de la clase Vector, y debe declararse en el mismo encabezado e implementarse en el mismo archivo fuente.De manera similar, podemos usar
friend
para simplificar la implementación de clases estrechamente acopladas, como una colección y un iterador. Nuevamente, declararía ambas clases en el mismo encabezado y las implementaría en el mismo archivo fuente.fuente
inline Vector operator*(double a, Vector v) { return v*a; }
. Solución canónica de hecho.inline Vector operator*(double a, Vector v) { return -v*a; }
y que todavía no requiere amistad.Las funciones de amigo no son diferentes a las funciones de miembro en términos de encapsulación. Sin embargo, pueden ofrecer otras ventajas, como ser más genéricos, especialmente en lo que respecta a las plantillas. Además, algunos operadores solo pueden especificarse como funciones libres, por lo que si desea que tengan acceso de miembro, debe hacerlo
friend
.Es mejor para
friend
una sola función que verse obligado a hacer algo que no quiere que sea público. Eso significa que todo el mundo puede usarlo, en lugar de una sola función.fuente
friend
una función que también sea "privada", como la declarada solo en una única TU.Si te apasiona lo que haces, estarías aprendiendo todo sobre C ++. Aprenda para qué se usan, cómo usarlos y luego, y solo entonces, decida no usarlos. Como mínimo, estará preparado cuando lea el código de otra persona que usa esta faceta de C ++.
fuente
" ¿Qué diría un experto en OOP? ... " Depende principalmente de cuán experto sea en C ++, eso, por su propia especificación, no es (y no quiere ser) un lenguaje para puristas.
OOP Zealots no usa C ++ (prefieren Smalltalk y les gusta Java).
Los zelots de programación funcional no usan C ++ (prefieren LISP y sus sucesores)
A la mayoría de los expertos en OOP no les gusta la función de amigo simplemente porque quieren que la parte OOP de C ++ se comporte como Smalltalk. Pero C ++ no es Smalltalk, y ni siquiera pueden entender que friend no rompa la encapsulación , por la sencilla razón de que una función no puede ser amiga de su clase sin que su clase lo desee .
Y desde el punto de vista de la "funcionalidad", entre
a.fn(b)
yfn(a,b)
no hay diferencia (dóndefn
hay un amigo): las partes involucradas son las mismas. Simplemente, una sintaxis puede ser más adecuada que otra: si fn es conmutativo con respecto a ,a
y probablemente sea más adecuado entonces (donde una apariencia tiene un "papel especial" que, de hecho, no lo es).b
fn(a,b)
a.fn(b)
fuente
fuente
Las preguntas frecuentes de C ++ son breves:
Las preguntas frecuentes presentan una de las formas más útiles de pensar sobre la amistad:
Quizás el uso más común de las funciones de amigo es sobrecargar << para E / S.
fuente
Las funciones de amigo se utilizan mejor para las definiciones de operador definidas por el usuario. Son útiles en otras situaciones, pero si te encuentras especificando clases de amigos con frecuencia, entonces puedes estar en un desvío de diseño (solo una buena autocomprobación para usar mientras escribes código).
Tenga cuidado con la declaración de "seguridad" en la pregunta original. Los modificadores de acceso están ahí para evitar que escribas código incorrecto por accidente, al igual que el compilador de alguna manera. Los modificadores de acceso limitan la interfaz y sirven para comunicar qué funciones son importantes para usar la clase (pública y protegida) y cuáles se crearon como parte de hacer que la clase sea más bonita para los mantenedores (privados). Los modificadores no constituyen seguridad, ya que hay muchas formas de obtener datos privados. Por ejemplo, obtenga un puntero a la clase y su tamaño, y vaya a pescar.
fuente
Las funciones de amigo de C ++ están estrechamente relacionadas con la siguiente funcionalidad:
Esto significa que no tienen este puntero y, por lo tanto, están fuera de la clase / objeto. Por otro lado, a menudo toman parámetros que los hacen pertenecer nuevamente a la clase. Aquí hay un ejemplo que aclara el enlace:
La única diferencia entre las funciones estáticas y las funciones de amigo es que una función de amigo puede usar varias clases.
El uso del mecanismo amigo en c ++ requiere programadores que tengan aproximadamente 10-15 años de experiencia con la forma de programación c ++, por lo que inicialmente debe evitarlo. Es una función avanzada.
fuente