微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 做一个修改类const之外的数据的方法是一个很好的做法吗?

我想问一个关于方法的正确性的问题.让我来说明情况.
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的对象的状态最终也会改变.

我想感谢大家的意见:-)

解决方法

如果MyClass拥有OtherClass实例,我将不会使discussionedMethod不变.

类也是一样,管理资源.即标准容器不使用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 *

原文地址:https://www.jb51.cc/c/111607.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐