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

时间:2016-01-27 22:48:09

标签: c++ c

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

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

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

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

2 个答案:

答案 0 :(得分:17)

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

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

  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,直接调用锁Lock()成员函数需要在某处调用Unlock()。但是,如果我们"包装"将资源转换为一个对象,在我们需要的时间内保存它,然后自动地#34;析构函数中的(释放,解锁等),没有必要记住释放内存,解锁等等。

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

答案 1 :(得分:8)

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