看看這個非常簡單的代碼:修改指針對象值在一個const方法
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並通過「a」修改值指針。好吧,我無法做類似「a = nullptr;」的事情因爲編譯器說:「你正試圖修改一個只讀對象」;但它可以讓我修改底層的值。這種行爲是否正確?在const方法中,不應該將「a」類型轉換爲「const A *」類似於「this」類型轉換爲「const B *」的方式?
謝謝!
您在'B'的代理中使用了錯誤的刪除[]。 –
nop,這是正確的;我創建了一個char數組。 – oopscene
你不修改'B'對象。你沒有承諾不修改其他對象('a'指向的東西)。 – tmpearce