【问题标题】:C++ Const correctness in C wrapper classC 包装类中的 C++ 常量正确性
【发布时间】:2021-03-02 08:55:43
【问题描述】:

有人可以就封装一些遗留 C 功能的 C++ 包装类中的 const 正确性给我一些建议。

给定以下部分封装 pthread 互斥 API 的类:

class Mutex {
private:
  pthread_mutex_t mMutex;

public:
  Mutex();
  void lock();
  void unlock();
  bool tryLock(); };

成员变量mMutex和lock()、unlock()和tryLock()方法是否应该声明为const?从 C++ 的角度来看,虽然这些方法都没有真正改变对象的值,但它们似乎确实改变了封装状态。

从概念上讲,“const”应该应用于对象的值、状态还是两者兼而有之?

【问题讨论】:

  • pthread_mutex_t 可以是一个结构体,pthread 函数可以直接修改结构体对象的成员。那么它就不能是 const 了。
  • 旁注:值得看看您是否可以加入std::mutex。可以为您节省大量时间。
  • 感谢您花时间回复,但这个问题与 const 正确性的概念有关,而不是 Mutex 类本身;我正在寻找的是关于 const 值和 const 状态的说明。
  • 由于pthread_mutex_t 是一种不透明的数据类型,您不知道它的内部状态如何存储或存储在何处。这意味着你不能让它保持不变。或者将对其操作的函数标记为常量。
  • 肯定“改变对象的 [...] 状态”不是任何人都希望调用 const-tagged 方法的事情吗?

标签: c++ pthreads const-correctness


【解决方案1】:

据我所知,<pthread.h> 中的所有三个函数都采用pthread_mutex_t* 参数。 pthread_mutex_t const* 参数。

因此,纯粹从技术角度来看,您已经必须使您的三个成员函数非 const,因为 const 成员函数将可以访问 this 作为 Mutex const 及其成员变量 mMutex 作为 pthread_mutex_t const。获取它的指针将需要 const_cast 打破 const 正确性。


但即使不是这样,拥有一个可以从承诺不会更改对象的上下文中调用的具有严重副作用的函数似乎也不正确。

因此,无论如何,您的成员函数都不是 const。

【讨论】:

  • 很好地解释并接受了答案;感谢您解决了我对这个问题的困惑。
猜你喜欢
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多