struct Foo
{
void SayHello()
{
std::cout << "Hi, I am Foo";
}
};
我有上面给出的结构。我在其中一个代码库中看到过这样的用法。
Foo foo;
{
foo.SayHello();
}
IMO,它和
一样Foo foo;
foo.SayHello();
或者第一种方法有什么优势/差异?
有什么想法吗?
答案 0 :(得分:5)
在这种特殊情况下,它看起来很奇怪,就像一个候选人。在其他情况下可能有用:
Foo foo;
{
ReturnValue v = foo.SayHello();
Send(v);
}
...
它会限制v
的范围。一个常见的用途是使其中的对象更早破坏。然后可以在大括号内使用在构造函数和析构函数中执行特殊操作的类:
Foo foo;
{
MutexLocker locker(sendMutex);
ReturnValue v = foo.SayHello();
Send(v);
}
...
在该示例中发送v
时将保持发送队列的锁定,并在闭合支撑处销毁锁定器时释放。
答案 1 :(得分:4)
答案 2 :(得分:0)
你有没有意味着你的第一个选择是
{
Foo foo;
foo.SayHello();
}
这会更有意义,因为foo对象是在包裹它的花括号的较小范围内创建,使用和销毁的。这是一种旨在减少瞬态事物寿命的常见做法。通常,这些子块可以重构为单独的函数。
答案 3 :(得分:0)
与书面相同(据我所知)。
正如其他人所说,这种结构通常用于限制某事物的范围,但在你的例子中,没有区别。