了解C++语法,适合有经验的 C 程序员

Understanding C++ syntax for an experienced C programmer

本文关键字:有经验 程序员 C++ 语法 了解      更新时间:2023-10-16

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

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

我试图从C++方面理解这个声明在做什么(即。我想了解语法,而不是关于正在发生的事情的功能的细节)。

这分为两个主要问题:1)函数前面的Lock::D BLock语句的目的是什么?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++中,一种用于"资源处理"的 commmon 策略称为 RAII(资源获取即初始化)——一个变量用于保存资源,并在初始化期间分配。这对"不要忘记撤消"有很大帮助 - 例如在函数中间返回的代码中,break退出循环或类似的事情。在 C 中,您始终必须注意释放锁、关闭文件、释放内存等的步骤 - 当然,如果您以错误的方式使用C++,您可能会陷入同样的陷阱 - 调用new肯定需要调用delete,直接调用锁Lock()成员函数需要在某处调用Unlock()。但是,如果我们将资源"包装"到一个对象中,该对象在我们需要的持续时间内保存它,并在析构函数中自动"放手"(释放、解锁等),则无需记住释放内存、解锁锁等。

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

代码是名为 dbLock 的类型为 Lock::DBLock 的变量的声明。 括号列表包含该类型的构造函数的参数。