2012-09-18 23 views
6

Duplicar posibles:
why private value of the obj can be changed by class instance?== sobrecarga puede acceder a miembros privados de argumento

en cuenta la (parcial) siguiente código:

class Group { 
    private: 
     int id; 

    public: 
     void set_id(int); 
     int get_id(); 
     bool operator==(const Group&); 
}; 


bool Group::operator==(const Group& g) { 
    if(g.id == this->id) { /* id is private? */ 
      return true; 
    } 

    return false; 
} 

El código se compila y los resultados parecen apropiados Sin embargo, en la parte if de la implementación de sobrecarga del operador, estamos accediendo directamente al miembro privado de su argumento: const Group& g, pero ¿no es válido dicho acceso?

+1

¿Qué pasa con 'g.id retorno == this-> id'? – sbi

+1

En una nota lateral, creo que el nombre de usuario "WeaklyTyped" coincide con esta pregunta muy bien. – datenwolf

+1

@sbi - tiene un 'this->' innecesario. –

Respuesta

16

Su operator== es miembro de su clase Group. Las funciones miembro pueden acceder a cualquier miembro private de esa clase, no solo para this, sino para cualquier instancia a la que puedan acceder.

Si lo piensa, este comportamiento es necesario, porque de lo contrario el control de acceso haría imposibles los métodos para la interacción de dos o más instancias (swap, copiadores, operadores), a menos que el objeto tenga acceso público a cualquier variable miembro. que se usa en tal método. Con frecuencia, eso no es deseable desde el punto de vista del diseño. Además elevaría la barra para el control de acceso a alto ("si simplemente hago público a ese miembro, puedo evitarme el dolor ...").

Como conclusión de este código es perfectamente válida (aunque no veo por qué el if es necesario, en comparación con el simple uso de return g.id == this->id;)

+0

Gracias! Para la explicación – WeaklyTyped

5

No, porque operator== es miembro de Group. Está justo allí en el nombre de la función. Eso significa que puede acceder a los miembros private de cualquier objeto de esa clase.

Si se trató de escribir como una función gratuita, que no habría compilado: calificadores

bool areEqual(const Group& g1, const Group& g2) { 
    return g1.id == g2.id; 
} 
13

de acceso no son el control de acceso en el nivel de instancia, sino en el nivel de tipo. Cualquier función miembro de una instancia de tipo T puede acceder a todos los miembros privados de cualquier otra instancia del mismo tipo T.

Dado que el operator== es una función miembro, puede acceder a todas las variables miembro de las instancias de la clase miembro de.

+0

Entiendo su punto, pero realmente agradecería que me indicara por qué los especificadores operan a nivel de tipo y no a nivel de instancia. Debe haber una razón. – WeaklyTyped

+1

@WeaklyTyped si no funcionaran en el nivel de tipo, no sería posible copiar constructo o asignar a menos que todos los datos fueran públicos o hubiera "captadores" para cada miembro de datos. – juanchopanza

+0

@WeaklyTyped: Porque C++ es un lenguaje comprobado de tipo estático y es imposible determinar de forma estática si el acceso permanece dentro de la instancia (Problema de detención).Tomemos por ejemplo la función miembro 'clase T {privada: barra int; public: void foo (T * t) {t * = t-> bar;} void spam() {foo (this);} '- foo puede ser llamado desde" fuera "de la clase o desde adentro usando' este 'puntero. En el momento de la compilación es imposible verificar estáticamente si esto sucede, o no. También lo que dijo juanchopanza. – datenwolf

Cuestiones relacionadas