Я читаю книгу под названием «Эффективный C ++, второе издание», в которой рассказывается о функциях-членах const и о том, как у вас есть побитовая константность и концептуальная константность.побитовое постоянство, которое заключается в том, что вы не можете изменять члены-данные объекта внутри функции-члена const.
Тогда есть пример функции-члена, которая, кажется, не действует побитово в тесте const.
Это выглядит так:
#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;
}
Когда он запускается, в моей книге говорится, что он должен позволить вам изменить значение s
, даже если оно const
.Это связано с тем, что данные char * указывают на то же значение, что и значение const char*
.*data
в данном случае не const
.
Однако, пытаясь запустить это в MS VC ++ 6.0, он выдает нарушение прав доступа в строке *nasty = 'M';
Может кто-нибудь объяснить, что происходитна?Я думаю, что я что-то пропустил?
Мне кажется, что, поскольку у нас есть const mystring s
, мы не можем его изменить, но тогда то, что он говорит в книгах, кажется неудобным.