sha*_*oth 16 c++ constructor design-patterns declaration
灵感来自这个问题.假设我有class Lock
一个默认的构造函数,在某些代码中我编写了以下语句:
Lock();
Run Code Online (Sandbox Code Playgroud)
这将产生创建临时对象class Lock
并立即销毁它的效果.当然,创作可能会产生一些副作用,这会改变程序行为,但这看起来很奇怪.
所以我的第一个猜测是,从语言角度看,这些语句完全有效,很可能包含逻辑错误.
上述声明是否有一些有效的用例?是否有一些众所周知的流行习语包括这些陈述?为什么我要在正确的程序中使用这些语句?
Ste*_*sop 14
它看起来并不比调用名为的void函数更奇怪Lock
.
并不是说我建议你把函数看作只是有趣的命名构造函数(无论它们的返回类型是什么),但语法有意相似.
我暂时不能想出一个很好的理由来创造但不能使用a Lock
,但是:
LockSession(lock);
Run Code Online (Sandbox Code Playgroud)
具有与您期望的相同的副作用:
acquire_and_then_immediately_release(lock);
Run Code Online (Sandbox Code Playgroud)
正如你所说,这很少是你想要的,所以它可能会像偶然的读者一样看错.如果由于一些奇怪的原因它是你想要的,并且你想避免使人混淆,你可以这样做:
{
LockSession session(lock);
// release immediately
}
Run Code Online (Sandbox Code Playgroud)
或者就此而言:
void acquire_and_then_immediately_release(Lock &lock) {
LockSession(lock);
}
Run Code Online (Sandbox Code Playgroud)
具有相同的效果和更少的机会让人头疼,无论这是否真的是你的意思,或者你是否只是犯了一个常见的错误,就是忘记提供一个名字,因此保持锁的时间比你应该的少.
你为什么要获得然后立即释放锁?可能是因为你(ab)使用它作为一种略微特殊的信号量.例如,你可以创建一堆带有锁的线程,如果每个线程做的第一件事就是这个,那么在完成所有线程创建之前,它们都不会超过它(加上父节点想要线程的其他任何东西)能够看到)并且父母释放锁.对于那些构造副作用很大的物体,可能有更好的例子.
远离副作用,另一种可能性是,如果要检查字符串是否是有效的XML,您可以写:
xml::dom::Document(mystring);
Run Code Online (Sandbox Code Playgroud)
期待无效数据的例外.同样,如果你调用了一个名字很好的函数,那么代码会更具可读性.构建DOM树并不是验证XML的最有效方法.但如果一个类是你已经拥有的,那么使用它是最简单的方法.
我想问题是类的名称很少描述创建和销毁它的副作用.因此,由于这个原因,一个孤独的临时人员看起来会很奇怪.
template
创建临时文件的类似语法在元程序或boost
某种库中多次使用。他们其实并不是创造临时的,而是模拟它的效果。
您可以在技巧中看到临时对象语法sizeof()
。