我正在查看MongoDB的源代码,并在函数内部看到以下声明,我不理解并且在我的C编程经验中没有看到。
Lock::DBLock dbLock(txn->lockState(), ns.db(), MODE_X);
我试图理解这个声明在C ++术语中做了什么(即我想理解语法,而不是关于正在发生的功能的具体细节)。
这分为两个主要问题: 1)函数前面的Lock :: DBLock语句的用途是什么? 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
的变量的声明。带括号的列表包含该类型的构造函数的参数。