了解C++语法,适合有经验的 C 程序员
Understanding C++ syntax for an experienced C programmer
我正在查看MongoDB的源代码,并在函数内部看到以下声明,我不理解,也没有在我的C编程经验中看到过。
Lock::DBLock dbLock(txn->lockState(), ns.db(), MODE_X);
我试图从C++方面理解这个声明在做什么(即。我想了解语法,而不是关于正在发生的事情的功能的细节)。
这分为两个主要问题:1)函数前面的Lock::D BLock语句的目的是什么?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++中,一种用于"资源处理"的 commmon 策略称为 RAII(资源获取即初始化)——一个变量用于保存资源,并在初始化期间分配。这对"不要忘记撤消"有很大帮助 - 例如在函数中间返回的代码中,break
退出循环或类似的事情。在 C 中,您始终必须注意释放锁、关闭文件、释放内存等的步骤 - 当然,如果您以错误的方式使用C++,您可能会陷入同样的陷阱 - 调用new
肯定需要调用delete
,直接调用锁Lock()
成员函数需要在某处调用Unlock()
。但是,如果我们将资源"包装"到一个对象中,该对象在我们需要的持续时间内保存它,并在析构函数中自动"放手"(释放、解锁等),则无需记住释放内存、解锁锁等。
我建议在提出进一步的问题之前,先阅读C++书中关于类和构造函数和析构函数对的第一章(你确实有一本书,对吧?)
代码是名为 dbLock
的类型为 Lock::DBLock
的变量的声明。 括号列表包含该类型的构造函数的参数。
- 为什么程序员同时使用 std::bad_alloc 和 std::exception.是否 std::例外 仅是不够的
- C++std::atomic在程序员级别保证了什么
- 如何检查程序员在C++中提供的两种不同格式的输入
- 为什么 C++ 程序员更喜欢前缀 ++,而 Java 程序员更喜欢后缀 ++?
- 程序员可以用 C++ 编写多少个嵌套结构
- 如果/else语句未显示/可变分配问题的输出;初学者程序员
- 安装/理解c++库的问题(新手程序员)
- 初学者程序员 c++(局部与全局变量声明)
- 工资计算器(加班工资)需要高级程序员的帮助
- 是否有任何合理的场景,程序员可能希望避免布尔表达式的短路计算
- 面向C++程序员的 SQL 简介
- 是否有可能有一个程序将键盘输入更改为所有其他程序
- 我想知道根据程序员的哲学在哪里声明变量
- c#程序员在c++中尝试事件
- 新的Linux程序员 - 尝试开发库
- 有没有一种非重复的方法允许程序员在成员初始化的复制和移动语义之间进行选择
- 作为一名初级程序员,我该如何开始制作桌面应用程序
- 了解C++语法,适合有经验的 C 程序员
- 有经验的程序员对closesocket()的关注
- 对于一个中级程序员来说,修改谷歌Chrome操作系统有多难,以及如何操作