Чета книга, наречена „Ефективен C++, второ издание“ и в нея се говори за константни функции-членове и как имате побитова константност и концептуална константност.
Той казва, че повечето компилатори ще работят с побитова константност, което е, че не можете да променяте членовете на данни на обект вътре в константна функция член.
След това има пример за член-функция, която изглежда не действа побитово в 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
, не би трябвало да можем да го променим, но тогава това, което пише в книгите, изглежда неудобно.