Je suis en train de lire un livre intitulé 'Effective C++, Second Edition' et de parler des fonctions des membres const et de la constance des bits et de la constance conceptuelle.C++ const member function
Il est dit que la plupart des compilateurs iront avec une constance au niveau du bit, c'est-à-dire que vous ne pouvez pas modifier les membres de données d'un objet dans une fonction membre const.
Ensuite, il y a un exemple de fonction membre qui ne semble pas agir au niveau du bit dans le test const.
Il va comme ceci:
#include "stdafx.h"
#include <string>
#include <iostream.h>
using namespace std;
class mystring
{
public:
mystring(const char* value);
operator char *() const { return data; }
private:
char * data;
};
mystring::mystring(const char * value)
{
mystring::data = const_cast<char*>(value);
}
int main(int argc, char* argv[])
{
const mystring s = "Hello";
char * nasty = s;
*nasty = 'M';
printf("s: %c", s);
return 0;
}
Lorsque cela est exécuté, il dit dans mon livre, il devrait vous permettre de changer la valeur de s
, même si son const
. Ceci parce que les données char * pointent vers la même valeur que la valeur const char*
. *data
dans ce cas n'est pas const
.
Cependant essayer de tourner ceci dans MS VC++ 6.0, il lance une violation d'accès à la ligne *nasty = 'M';
Quelqu'un peut-il expliquer ce qui se passe? Je pense que j'ai raté quelque chose?
Pour moi, il semble que parce que nous avons un mystring s
const, nous ne devrions pas être en mesure de le changer, mais alors ce qu'il dit dans les livres semble maladroit.
Ceci n'est pas pertinent à la question, mais gardez à l'esprit que cette édition du livre, et Visual Studio 6, datent des jours avant que la langue ait été standardisée, quand beaucoup d'idiomes C++ communs n'avaient pas été pensé pour le moment. Si vous voulez apprendre comment C++ est utilisé aujourd'hui, vous seriez mieux avec la troisième édition (que je recommande vivement), et un compilateur moderne. Visual Studio Express est gratuit à télécharger, si vous voulez rester avec Microsoft. –