了解经验丰富的C程序员的C++语法

Ale*_*rdt 3 c c++

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

Lock::DBLock dbLock(txn->lockState(), ns.db(), MODE_X);
Run Code Online (Sandbox Code Playgroud)

我试图理解这个声明在C++术语中做了什么(即我想要理解语法,而不是关于正在发生的功能的具体细节).

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

Mat*_*son 17

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

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

  Lock::DBLock
Run Code Online (Sandbox Code Playgroud)

变量被调用dbLock.它用a txn->lockState(),ns.db()a和a 调用构造函数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
 };
Run Code Online (Sandbox Code Playgroud)

当变量超出范围时,会自动调用析构函数(更糟糕的是当您离开{}变量所在的对时).

在C++中,"资源处理"的一个通用策略称为RAII(资源获取是初始化) - 变量用于保存资源,并在初始化期间分配.这有助于"不要忘记撤消" - 例如,在函数中间返回的代码中break,退出循环或类似的东西.在C中,你总是需要注意释放锁,关闭文件,释放内存等的步骤 - 当然,如果你以错误的方式使用C++,你可能会陷入同样的​​陷阱 - 调用new肯定需要一个电话到delete,直接调用锁定Lock()成员函数需要Unlock()调用的地方.但是如果我们将资源"包装"到一个持有它的对象中我们需要它,并在析构函数中自动"释放"(释放,解锁等),就不需要记住释放内存,解锁,等等

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


Joh*_*ger 8

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