Qu'est-ce que le C++ équivalent de C#'s en lecture seule modificateur de champ?
Verrouillage de l'etat est grande. En C#, vous pouvez vous assurer qu'un champ ne change pas c'est la valeur de référence et une fois que le constructeur se termine en déclarant comme readonly
.
class Foo
{
private readonly string _foo;
public Foo() {
_foo = "Unchangeable";
}
public void ChangeIt() {
_foo = "Darn"; //compiler error
}
}
Puis-je faire la même chose avec C++? Si oui, comment? Si non, pourquoi pas?
OriginalL'auteur Drew Noakes | 2011-05-16
Vous devez vous connecter pour publier un commentaire.
Qui serait const. Notez que ce mot signifie un couple de choses différentes dans des contextes différents.
Les deux décrivent essentiellement la même chose, mais le nouveau est beaucoup moins négatif au sujet de la chose entière. Comme je suis const, je préfère la liaison neutre de la description 😉 Si vous aimez ma réponse, pourriez-vous l'accepter?
Patience mon ami. En général, je laisse une question de s'asseoir pendant un certain temps avant de l'accepter pour voir ce que les autres réponses de la surface. Une fois qu'une question est posée, elle tend à susciter moins l'attention des passants. Profitez du suspense.
Bonne stratégie - jamais pensé à ça (n'ont pas besoin, puisque je n'ai pas posé une question encore).
Cette réponse est fausse. C++
const
est égale à C#'sconst
mot-clé, pasreadonly
. Vous ne pouvez pas assigner une valeur à uneconst
champ dans le constructeur lui-même en C++, uniquement si vous utilisez une liste d'initialisation. Cela rend C++const
membres inutile, parce que se déplacer et copier des attributions de ne pas avoir quelque chose comme une liste d'initialisation.OriginalL'auteur jackrabbit
il semble que vous avez raison - qu'ils sont réservées uniquement dans l'espace de noms global, non pas dans le contexte d'une classe. Je vais corriger ma réponse. stackoverflow.com/questions/228783/...
+1, mais désolé d'être pointilleux.
pas besoin de s'excuser. Chaque fois que j'ai corrigé, j'apprends quelque chose, et je l'apprécie.
OriginalL'auteur Mark Ransom
Il n'était pas immédiatement clair pour moi après la lecture de la accepté de répondre que, pour faire un exact équivalent de
readonly
mot-clé, vous devez déclarer le membre comme ceci:Espère que cette aide.
OriginalL'auteur serine
Une référence en C++ n'est pas rebindable, il est donc équivalent à un C# en lecture seule référence.
std::string &s
peut être changé parfaitement bien et que le changement pourrait se propager à tout le monde l'utilise.C#'s en lecture seule fonctionne de la même manière, un readonly StringBuilder peut avoir son contenu a changé, mais de ne pas être lié à un autre StringBuilder.
Non, pas vraiment. Les références peuvent être modifiée pour faire référence à un tout autre objet, tandis qu'un champ en lecture seule reportez-vous toujours à la même chose, même si cette chose peut changer son état interne. Pour les types référence, il peut fonctionner assez similaire dans la pratique. Mais la différence est clairement visible avec des types valeur, qui peut être changé avec C++ références, mais pas avec C# readonly champs.
C# en lecture seule pour les types de valeur est une chose tout à fait différente qu'elle ne l'est pour les types référence. C++ références ne peut pas pointer vers un objet différent une fois lié, mais en changeant la valeur d'un int n'est pas pointant vers un autre objet en C++.
Le point est:
x = 0;
n'est pas supposé travailler. Avec C++ références, il n'. Avec un C# champ en lecture seule, il ne le fait pas. (Mais pour pinailler, vous êtes toujours mal, sauf si vous tenez compte de l'emplacement - par exemple, la variable de référence se réfère à un "objet", qui est peut-être valable, mais n'est pas utile et au-delà de ce "objet" désigne dans d'autres langues.)OriginalL'auteur BCoates
Il n'y a pas une telle chose directement. Vous pouvez utiliser un champ privé avec un public de lecture (mais pas de setter). Mais qui ne s'appliquerait qu'aux autres classes d'appeler votre code.
Foo
a toujours accès complet à ses membres. Mais puisque vous êtes le responsable de l'implémentation deFoo
, ce n'est pas vraiment de problème.OriginalL'auteur Christian Rau
C++ a
const
, qui fait le même travail quereadonly
en C#.const
pour une variable locale (comme cet exemple semble montrer), les mêmes queconst
pour un champ, comme dans la question d'origine?OriginalL'auteur anijhaw
J'ai eu le même besoin que vous lors d'une transcription à partir de C# C++
et c'est juste une erreur de syntaxe car cette instruction existe en C++ ( visual C++)
Syntaxe : [readonly]
"Le C++ readonly attribute a la même fonctionnalité que le readonly MIDL attribut.
Si vous voulez interdire la modification d'un paramètre d'une méthode, puis utiliser l'attribut".
source : https://msdn.microsoft.com/en-us/library/45x4ky7s.aspx
source : https://msdn.microsoft.com/library/windows/desktop/aa367152
OriginalL'auteur moons17