¿Cuál es el equivalente en C ++ del modificador de campo de solo lectura de C #? [duplicar]

El estado de bloqueo es genial. En C # puede asegurarse de que un campo no cambie su valor / referencia una vez que el constructor se complete declarándolo como readonly.

class Foo
{
    private readonly string _foo;

    public Foo() {
        _foo = "Unchangeable";
    }

    public void ChangeIt() {
        _foo = "Darn";        // compiler error
    }
}

¿Puedo hacer lo mismo con C ++? ¿Si es así, cómo? ¿Si no, porque no?

preguntado el 16 de mayo de 11 a las 16:05

@NicolBolas cerró esto como un engaño, pero llegó primero y tiene cuatro veces más vistas que el supuesto original. -

La pregunta de destino tiene respuestas mucho mejores. Y eso importa más. La respuesta aceptada aquí es una respuesta de solo enlace que menciona una palabra clave, como si eso explicara todo. La respuesta aceptada allí entra en detalles sobre lo que const es y cómo usarlo. -

7 Respuestas

Eso sería const. Tenga en cuenta que esta palabra clave significa un par de cosas diferentes en diferentes contextos.

contestado el 16 de mayo de 11 a las 20:05

Ambos enlaces son bastante buenos (edición previa / posterior). Muchas gracias. - Dibujó Noakes

Ambos describen básicamente lo mismo, pero el nuevo es mucho menos negativo sobre todo. Como me gusta const, prefiero vincular a la descripción neutral;) Si te gusta mi respuesta, ¿quizás podrías aceptarla? - Jackrabbit

Paciencia mi amigo. Por lo general, dejo que una pregunta permanezca un rato antes de aceptarla para ver qué otras respuestas surgen. Una vez que se responde una pregunta, tiende a atraer menos atención de los transeúntes. Disfruta el suspenso. - Dibujó Noakes

Buena estrategia: nunca pensé en eso (no lo he necesitado, ya que aún no he hecho una pregunta). - Jackrabbit

Esta respuesta es incorrecta. C ++ const es igual a C # const palabra clave, no readonly. No puede asignar un valor a un const en el propio constructor en C ++, solo si usa una lista de inicialización. Esto hace que C ++ const miembros inútiles, porque mover y copiar asignaciones no tienen nada como una lista de inicialización. - OddRaven

class Foo
{
private:
    const string _foo;
public:
    Foo() : _foo("Unchangeable")
    {
    }
    void ChangeIt()
    {
        _foo = "Darn";        // compiler error
    }
};

contestado el 16 de mayo de 11 a las 20:05

La nota sobre los identificadores que comienzan con un guión bajo no es 100% correcta. - de

@dalle, parece que tienes razón: solo están reservados en el espacio de nombres global, no dentro del contexto de una clase. Arreglaré mi respuesta. stackoverflow.com/questions/228783/… - Mark Ransom

+1, pero lo siento por ser exigente. - de

@dalle, no hay necesidad de disculparse. Cada vez que me corrigen, aprendo algo y lo aprecio. - Mark Ransom

No existe tal cosa directamente. Puede utilizar un campo privado con un captador público (pero sin definidor). Pero eso solo se aplicaría a otras clases que llamen a su código. Foo siempre tiene pleno acceso a sus miembros. Pero dado que eres el implementador de Foo, esto no es un problema real.

contestado el 16 de mayo de 11 a las 20:05

Después de leer la respuesta aceptada, no me quedó claro de inmediato que para hacer el equivalente exacto de readonly palabra clave que necesita para declarar el miembro de esta manera:

class Y
{
public:
     void mutate() { x = 7; } // not const member
     int x;
};

class X
{
private:
    Y * const member; // this only makes the pointer to Y const, 
                      // but you can still modify the object itself
public:
    X(Y *m) : member(m) {}

    void f() { member->mutate(); }
};

Espero que esto ayude.

Respondido 27 Abr '15, 23:04

Una referencia en C ++ no se puede volver a enlazar, por lo que es equivalente a una referencia de solo lectura de C #.

contestado el 16 de mayo de 11 a las 20:05

La referencia no se puede cambiar. Sin embargo, la cosa a la que apunta la referencia se puede cambiar. Un miembro std::string &s se puede cambiar perfectamente bien y el cambio se propagaría a todos los que lo usen. - usuario395760

@delnan: C #'s readonly funciona de la misma manera, un StringBuilder de solo lectura puede cambiar su contenido pero no estar vinculado a un StringBuilder diferente. - BCoates

No en realidad no. Las referencias se pueden cambiar para referirse a un objeto completamente diferente, mientras que un campo de solo lectura siempre se refiere a lo mismo, aunque esto pueda cambiar su estado interno. Para los tipos de referencia, puede funcionar bastante similar en la práctica. Pero la diferencia es claramente visible con los tipos de valor, que se pueden cambiar con referencias de C ++ pero no con campos de solo lectura de C #. - usuario395760

C # readonly para tipos de valor es algo completamente diferente de lo que es para los tipos de referencia. Las referencias de C ++ no pueden apuntar a un objeto diferente una vez enlazadas, pero cambiar el valor de un int no apunta a un objeto diferente en C ++. - BCoates

El punto es: x = 0; no se supone que funcione. Con referencias de C ++, lo hace. Con un campo de solo lectura de C #, no lo hace. (Pero para ser quisquilloso, todavía está equivocado a menos que considere la ubicación, por ejemplo, la variable, la referencia se refiere a un "objeto", que podría ser válido pero no es útil y más allá de lo que "objeto" se refiere en otros idiomas). - usuario395760

C ++ tiene const, que hace el mismo trabajo que readonly C ª#.

const int Constant1 = 96;    
Constant1 = 200   // Compiler Error.

contestado el 16 de mayo de 11 a las 20:05

Is const para una variable local (como este ejemplo parece mostrar) lo mismo que const para un campo, como en la pregunta original? - Dibujó Noakes

Solo lectura en C # tiene un valor asignado en ctr, mientras que const es un valor conocido en tiempo de compilación, por lo que no son lo mismo. - Огњен Шобајић

Los compiladores optimizan los valores de constante (tanto en C ++ como en C #). No son de solo lectura, ya que sus valores no se conocen a continuación. - Огњен Шобајић

No hace el mismo trabajo que solo lectura en C #. Const local o campo en C ++ debe inicializarse cuando se define. Readonly in C # no tiene que inicializarse cuando está definido, se puede inicializar más tarde en un constructor. También puede tener solo un campo de solo lectura y no una variable local. Además, const en C # tiene que ser inicializado por una expresión constante y conocido en un tiempo de compilación, como dijo @ ОгњенШобајић. - KulaGGin

Tuve la misma necesidad que tú al hacer una transcripción de C # a C ++ y es solo un error de sintaxis porque esta instrucción existe en C ++ (visual C ++)

Sintaxis: [solo lectura]

"El atributo C ++ de solo lectura tiene la misma funcionalidad que el atributo MIDL de solo lectura. Si desea prohibir la modificación de un parámetro de método, utilice el atributo in".

fuente: https://msdn.microsoft.com/en-us/library/45x4ky7s.aspx

fuente: https://msdn.microsoft.com/library/windows/desktop/aa367152

Respondido el 18 de junio de 18 a las 15:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.