C++ 理解C++;有经验的C程序员的语法

C++ 理解C++;有经验的C程序员的语法,c++,c,C++,C,我正在浏览MongoDB的源代码,并在函数中看到以下声明,我不理解,在我的C编程经验中也没有见过 Lock::DBLock dbLock(txn->lockState(), ns.db(), MODE_X); 我试图理解这个声明在C++术语中的作用(例如,我想理解语法,而不是具体的关于正在进行的功能的细节)。 这分为两个主要问题: 1) 函数前面的Lock::DBLock语句的用途是什么? 2) 这是函数调用还是函数声明?代码是类型为Lock::dbLock的名为dbLock的变量的声明

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

Lock::DBLock dbLock(txn->lockState(), ns.db(), MODE_X);
我试图理解这个声明在C++术语中的作用(例如,我想理解语法,而不是具体的关于正在进行的功能的细节)。 这分为两个主要问题: 1) 函数前面的Lock::DBLock语句的用途是什么?
2) 这是函数调用还是函数声明?

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

它是一个带构造函数的变量声明-因此它既是一个函数调用[对象构造函数],也是一个变量声明

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

  Lock::DBLock
该变量称为
dbLock
。它使用
txn->lockState()
调用构造函数,
ns.db()
MODE\ux

我猜
txn->lockState
实际上返回了一个lock对象,我们锁定的对象是
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(资源获取是初始化)-一个变量被用来保存一个资源,并且在初始化过程中被分配。这有助于“不忘记撤消”。例如,在函数中间返回的代码中,<代码>破解< /C> >退出循环,或类似的事情。在C中,您必须注意释放锁、关闭文件、释放内存等的步骤。当然,如果使用错误的方式使用C++,则会陷入相同的陷阱——调用<代码>新< /代码>有限地需要调用
delete
,直接调用locks
Lock()
成员函数需要在某个地方调用
Unlock()
。但是如果我们将资源“包装”到一个对象中,并在需要的时间内保存它,就会自动“释放”(释放、解锁等)在析构函数中,不需要记住释放内存、解锁锁等


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

这不是一个函数,它是一个名为
dbLock
的变量,它的类型是
Lock::dbLock
,它是使用一个传递三个值的构造函数创建的。它类似于
int some_integer_variable(3);
它声明一个变量并对其进行初始化。@jaggedSpire:已更改并给出了示例。您可能希望添加一条关于自动发生的析构函数调用的注释,并对其进行RAII。@LokiAstari:是的。这开始成为一本“关于如何编写C++的书”,但我也添加了它。@MatstPeterson:-)这就是好问题获得所有选票的原因:-)细节很重要。但是谢谢你,比你强!有道理