この非常に単純なコードを見てください。
struct A { char* s; };
class B
{
A* a;
public: B(const char* s) : a(new A()) {
int len = strlen(s);
a->s = new char[len + 1];
memcpy(a->s, s, len + 1);
}
~B() { delete [] a->s; delete a; }
const char* c_str() const { return a->s; }
const B& to_upper() const {
char* x = a->s;
int len = strlen(x);
for (int i = 0; i < len; i++)
{
char k = x[i];
if (k >= 'a' && k <= 'z')
x[i] -= 32;
}
a->say_hi();
return *this;
}
};
int main() {
B b = "hola mundo";
printf("%s\n", b.to_upper().c_str());
}
できます!!私の質問は...なぜですか?
to_upper()メソッドはconstであり、値のpointeeを「a」で変更します。わかりました。「a=nullptr;」のようなことはできません。コンパイラが次のように言っているからです。「読み取り専用オブジェクトを変更しようとしています」。ただし、基になる値を変更できます。この動作は正しいですか?constメソッドで"this"の型が"constB *"に変換されるのと同じ方法で、"a"型を"const A *"に変換するべきではありませんか?
ありがとう!