【发布时间】:2017-11-10 13:29:39
【问题描述】:
在 Java 中可以执行以下操作:
function(new Parameter());
在 C++ 中我知道我可以做到:
Parameter p;
function(p);
但是有没有可能做这样的事情:
function(Parameter p);
在 C++ 中?
【问题讨论】:
标签: c++ object initialization parameter-passing
在 Java 中可以执行以下操作:
function(new Parameter());
在 C++ 中我知道我可以做到:
Parameter p;
function(p);
但是有没有可能做这样的事情:
function(Parameter p);
在 C++ 中?
【问题讨论】:
标签: c++ object initialization parameter-passing
是的。与 Java 相比,您需要决定是在堆栈上还是在堆上创建它。前者可以具有值语义(行为类似于 int——复制/移动类似于 int,没有多态行为),而后者将具有引用语义(指同一个对象实例,可以表现多态,通过克隆进行复制)。
void ref( const X& x ) { x.do(); } // Reference semantics
void ptr( const X* const x ) { x->do();} // Reference semantics
void val( const X x ) { x.do(); } // Value semantics
int main()
{
ref( X{} ); // Created on the stack
ptr( new X{} ); // Created on the heap, but leaks!
val( X{} ); // Created on the stack, moved rather than copied if available
auto x = X{}; // Created on the stack
ref( x );
ptr( &x );
val( x ); // Makes a copy of the object
auto p = std::make_unique<X>(); // Created on the heap, doesn't leak
ref( *p );
ptr( p.get() );
val( *p ); // Makes a copy of the heap object on the stack
}
注意:如果您跳过一些环节,您可能会有多态行为带有值语义。例如,参见 Louis Dionne 在 CppCon17 上Runtime Polymorphism 的演讲。如果您不跳过这些环节,而是尝试多态地使用值对象,那么您最终可能会遇到对象切片。
【讨论】:
是的,你可以做这样的事情。由于这是一个临时变量,因此您无需像在 Java 中那样命名它。
语法是:
function(Parameter());
如果类需要参数,你只需将它传递给临时变量构造函数:
function(std::string("hello"));
最后,您为 Java 编写的内容也可以在 c++ 中使用:
function(new Parameter());
但这会在堆上分配参数对象,为了避免内存泄漏,你必须在函数内部删除它。但这通常是个坏主意。
【讨论】: