C++ 理解C++;有经验的C程序员的语法
我正在浏览MongoDB的源代码,并在函数中看到以下声明,我不理解,在我的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的变量的声明
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
,直接调用locksLock()
成员函数需要在某个地方调用Unlock()
。但是如果我们将资源“包装”到一个对象中,并在需要的时间内保存它,就会自动“释放”(释放、解锁等)在析构函数中,不需要记住释放内存、解锁锁等
我建议在提出进一步的问题之前,您先阅读中关于类和构造函数与析构函数对的第一章(您确实有一本书,对吗?)这不是一个函数,它是一个名为
dbLock
的变量,它的类型是Lock::dbLock
,它是使用一个传递三个值的构造函数创建的。它类似于int some_integer_variable(3);
它声明一个变量并对其进行初始化。@jaggedSpire:已更改并给出了示例。您可能希望添加一条关于自动发生的析构函数调用的注释,并对其进行RAII。@LokiAstari:是的。这开始成为一本“关于如何编写C++的书”,但我也添加了它。@MatstPeterson:-)这就是好问题获得所有选票的原因:-)细节很重要。但是谢谢你,比你强!有道理