ventajas usos usar tipos tipo sharp runtimebinderexception runtimebinder puede programacion microsoft los invocar funcionan funcion delegate delegados delegado csharp concepto como c++ pointers const const-correctness

c++ - usos - tipos de delegates



Invocar un método nonconst en un miembro desde un método const (3)

Me sorprendió encontrar este "agujero" en "constness":

#include <stdio.h> class A { int r ; public: A():r(0){} void nonconst() { puts( "I am in ur nonconst method" ) ; r++; } } ; class B { A a ; A* aPtr ; public: B(){ aPtr = new A() ; } void go() const { //a.nonconst() ; // illegal aPtr->nonconst() ; //legal } } ; int main() { B b ; b.go() ; }

Así que, básicamente, desde el método const B::go() , puede invocar la función miembro non-const (acertadamente llamada nonconst() ) si el objeto del tipo A es referenciado por un puntero.

¿Porqué es eso? Parece un problema (como que estaba en mi código, donde lo encontré).


Definición de idioma de const

Me sorprendió encontrar este "agujero" en "constness":

No hay ninguno.

const aplica uniformemente a todos los miembros de la clase: en una función de miembro de clase de la clase C , this tiene type const C * , por lo que para un miembro C::mem declarado como tipo T :

class C { // ... T mem; };

this->mem tiene tipo const T

Por favor, tome el tipo para discernir cuál es el tipo declarado T y el tipo const calificado correspondiente para todos los miembros.

Parece un problema (como que estaba en mi código, donde lo encontré).

Solo porque la aplicación sistemática de las reglas no haga lo que usted espera no significa que haya un problema con las reglas, significa que hay un problema con sus expectativas.

Debe anotar sus expectativas para ver que esperaba una aplicación no uniforme si const a diferentes tipos.

Cuando programa, debe razonar lógicamente. Debe inferir cosas, no esperarlas cuando no hay una razón lógica.

Usando const correctamente

¿Porqué es eso?

Tus clases se llaman A y B , es bastante difícil entender qué constituye el estado lógico y qué no. ;) Hace una pregunta "moral" (no una pregunta solo sobre programas C ++ legales / ilegales), y su fragmento de código no tiene ningún valor "moral". Si realmente publica un código relevante, podríamos hacer algunos juicios "morales" al respecto.

Estado lógico

Debe declarar const las funciones que no cambian el "estado lógico" del objeto al que se aplica.

Significa que debe definir cuál es el "estado lógico" de las instancias de su clase : es un concepto abstracto, y solo usted puede definirlo, porque es un concepto de alto nivel. El "estado lógico" se relaciona con el problema que tu clase debería resolver.

Entonces puede discernir qué variables contribuyen al estado lógico: does *(b.aPtr) contribuye al estado lógico de b ?

Preguntas estrechamente relacionadas

¿Conoces el constructor de copias?

Acerca del operador de asignación de copias?

Acerca del destructor?


Cuando y objeto de tipo B es const, entonces todos sus miembros son const, lo que significa que sus dos miembros son, durante la duración de B::go() , efectivamente

A const a; A * const aPtr;

El primero es un objeto constante de tipo A , en el que solo puede llamar a las funciones miembro de const. El segundo, sin embargo, es un puntero constante a una A no constante. No se puede decir legalmente aPtr = <anything> desde dentro de la función B::go() , ya que eso modificaría aPtr , que es constante.

Un puntero a una constante A se declararía como A const* aPtr o const A* aPtr , lo que haría que llamar a la no constante A::nonconst() ilegal.


La "constidad" de un objeto no se extiende a otros objetos a través de punteros. En su ejemplo, la parte const es el objeto entero a , o el puntero aPtr . Como aPtr es un A * y no un const A * , puede llamar a un método no const.

Si cambias

A* aPtr ;

a

const A* aPtr ;

entonces no podrá llamar aPtr->nonconst() .