c++ - 为有经验的 C 程序员理解 C++ 语法

标签 c++ c

我正在查看 MongoDB 的源代码,并在函数内部看到以下声明,我不理解,在我的 C 编程经验中也没有看到过。

Lock::DBLock dbLock(txn->lockState(), ns.db(), MODE_X);

我试图理解这个声明在 C++ 术语中的作用(即我想理解语法,而不是关于正在发生的事情的功能的细节)。

这分为两个主要问题: 1)函数前面的Lock::DBLock语句的作用是什么? 2) 这是一个函数调用,还是一个函数声明?

最佳答案

它是一个带有构造函数的变量声明 - 所以它既是一个函数调用 [对象构造函数] 又是一个变量声明。

它声明了一个类型的变量;

  Lock::DBLock

该变量称为 dbLock。它使用 txn->lockState()ns.db()MODE_X 调用构造函数。

我的猜测是 txn->lockState 实际上返回了一个锁定对象,我们锁定的是 ns.db() - 在“独占模式” ”。但这是一个猜测,您必须在环境中查找这些内容。

不看文档,我认为 Lock::DBLock 是一个“锁管理器”,换句话说,它在创建时获取锁,在销毁时释放锁。

一个简单的锁管理器看起来像这样:

 class LockMgr
 {
      LockMgr(SomeLockType &X) : keeper(X)
      {
         keeper.Lock();
      }
      ~LockMgr()
      {
         keeper.Unlock();
      }
      private:
        SomeLockType& keeper;    // Must be reference to original lock
 };

当变量超出范围时(在其他更糟糕的情况下,当您离开变量所在的 {} 对时,会自动调用析构函数。

在 C++ 中,一种常见的“资源处理”策略称为 RAII(资源获取即初始化)——一个变量用于保存资源,并在初始化期间分配。这对“不要忘记撤消”有很大帮助 - 例如在函数中间返回的代码中, break 退出循环,或类似的事情。在 C 中,您始终需要注意释放锁、关闭文件、释放内存等的步骤 - 当然,如果您以错误的方式使用 C++,您可能会陷入同样的​​陷阱 - 调用 new肯定需要调用delete,直接调用locks的Lock()成员函数需要在某处调用Unlock()。但是,如果我们将资源“包装”到一个对象中,在我们需要的时间内持有它,并在析构函数中自动“释放”(释放、解锁等),则无需记住释放内存、解锁锁,等等等等

我建议您在提出更多问题之前先阅读 your C++ book 中关于类和构造函数与析构函数对的第一章。 (你确实有一本书,对吧?)

关于c++ - 为有经验的 C 程序员理解 C++ 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35049619/

相关文章:

c++ - 我的 C++ 程序没有跟踪我的 3n+1 最长序列

c++ - constexpr 类成员的优缺点

C 检查两个字符串是否相同

将字符串与c中的字符串列表进行比较

代码片段警告 : cast to pointer from integer of different size

c - 将值放入 char 二维数组中

c++ - 人物轮廓的选择

c++ - 如何将矩阵提升为具有多个线程的幂?

c++ - 为什么 QMutex 未知?

c - 将 ImageMagick lib 的 ImageWand 组件与 CMake 结合使用