gpt4 book ai didi

c++ - 为有经验的 C 程序员理解 C++ 语法

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:25:39 25 4
gpt4 key购买 nike

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

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

我试图理解这个声明在 C++ 术语中的作用(即我想理解语法,而不是关于正在发生的事情的功能的细节)。

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

最佳答案

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

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

  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,直接调用locks的Lock()成员函数需要在某处调用Unlock()。但是,如果我们将资源“包装”到一个对象中,在我们需要的时间内持有它,并在析构函数中自动“释放”(释放、解锁等),则无需记住释放内存、解锁锁,等等等等

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

关于c++ - 为有经验的 C 程序员理解 C++ 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35049619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com