gpt4 book ai didi

c++ - 在 const 方法中修改指针值

转载 作者:太空宇宙 更新时间:2023-11-04 15:24:45 25 4
gpt4 key购买 nike

看看这段非常简单的代码:

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方法中将“this”类型转换为“const B*”一样,将“a”类型转换为“const A*”吗?

谢谢!

最佳答案

方法的常量转换为*this 对象的常量,这意味着在to_upper 中,this 指针的类型为常量 B *。这里的所有都是它的。不多也不少。例如,这与您在 C 语言中看到的效果没有什么不同。它使指针 this->a 成为常量,但它不会影响指针对象。

事实上,由您决定B 的常量性是否传播到this->a 指向的A 对象。该语言为您提供了做出此决定的充分自由。它被称为“概念常量”(与“物理常量”或“逻辑常量”相对)。编译器仅观察并强制执行逻辑常量,而 OOP 中关键字 const 的目的远不止于此:它允许您在设计中实现概念常量的想法。

如果A对象被认为是B的组成部分,那么B的constness也应该意味着A的constness 。但这是你必须手动观察和强制执行的事情(或者一些智能指针类可以帮助你)。

如果 A 对象是一个独立的对象,恰好只是从 B引用,那么 B 的常量性code> 不一定意味着 A 的常量性。

编译器不会就此对您施加任何决定,因为编译器不知道您要实现的对象关系是什么。在您的设计中,在我看来,A 对象实际上是 B 的组成部分,这意味着您不应该声明您的 to_upper 作为 const。它是一个修改函数。它改变了用户认为的 B 的值。通过将 to_upper 声明为 const,您实际上是在对用户“说谎”。

关于c++ - 在 const 方法中修改指针值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11287459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com