class MyClass { public: ... void DiscussedMethod() { otherClass->NonConstMethod(); } private: OtherClass *otherClass; };
我有一个MyClass类,它保留指向OtherClass的指针.在DiscussionedMethod中,它调用另一个可变数据的OtherClass :: NonConstMethod.
我想知道,讨论方法常量(因为它不修改任何成员数据)是否是一个好的做法?这是不好的做法吗?还是不错?
如果OtherClass保留指向MyClass的指针,并且在NonConstMethod中修改了MyClass的一些数据(这意味着在讨论的方法调用期间MyClass成员数据将会更改).那么做一个讨论的方法常规是不好的做法?
据我所知,方法中的const主要是一个代码记录的东西,所以我可能会倾向于不使讨论的方法const,但是我想听听你的意见.
编辑:有些答复考虑了otherClass指向的对象是否由MyClass对象拥有.在我正在使用的情况下不是这样.让我们说这两个对象独立地并排存在(具有彼此修改的能力).我认为这个比喻很好地描述了我的情况.
例如,考虑像双向链表,其中每个元素是一个类,保持指向其邻居的指针和成员变量颜色.并且它有方法MakeNeighboursRed改变其邻居的颜色,但不影响调用对象的状态本身.我应该考虑做这个方法const吗?
而如果有一些可能性,MakeNeighboursRed会打电话给邻居的MakeNeighboursRed.所以最终,MakeNeighboursRed的对象的状态最终也会改变.
我想感谢大家的意见:-)
解决方法
类也是一样,管理资源.即标准容器不使用const函数返回非const引用或指向托管内存的指针,尽管它是“可能的”(因为持有资源的实际指针未被修改).
考虑
class MyClass { public: bool a() const { return otherClass->SomeMethod(); } void b() const { otherClass->NonConstMethod(); } private: OtherClass *otherClass; }; void foo (MyClass const &x) { cout << boolalpha << x.a() << endl; x.b(); // possible if b is a const function cout << boolalpha << x.a() << endl; }
foo可以打印两个不同的值,尽管foo的实现者可能期望const对象上的两个函数调用将具有相同的行为.
澄清:
以下是根据标准无效的,因为const [const]的operator []返回std :: vector< T> :: const_reference,它是对值类型的常量引用.
std::vector<int> const a = { /* ... */ }; a[0] = 23; // impossible,the content is part of the state of a
如果这个函数只有一个签名,即referece operator [](size_t i)const,这是可能的,因为该操作不会改变向量的内部指针,而是改变它们指向的内存.
但是由向量管理的存储器被认为是向量状态的一部分,因此通过const向量接口修改是不可能的.
如果向量包含指针,那么这些指针仍然将通过公共常量向量接口不可修改,尽管存储在向量中的指针可能非常简单,并且很可能改变它们指向的内存.
std::vector<int*> const b = { /* ... */ }; int x(2); b[0] = &x; // impossible,b is const *b[0] = x; // possible since value_type is int* not int const *