在Java中,可以执行以下操作:
function(new Parameter());
在C ++中我知道我可以这样做:
Parameter p;
function(p);
但是可以这样做:
function(Parameter p);
在C ++中?
答案 0 :(得分:6)
是。与Java相比,您需要决定是在堆栈上还是在堆上创建它。前者可以具有值语义(行为类似于int - 复制/移动像int,没有多态行为),而后者将具有引用语义(指向相同的对象实例,可以表现多态,通过克隆复制)。 / p>
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的演讲。如果你没有跳过这些箍但是尝试多态地使用一个值对象,你最终可能会遇到对象切片。
答案 1 :(得分:6)
是的,你可以做这样的事情。由于这是一个临时变量,因此您不需要像在Java中那样命名它。
语法为:
function(Parameter());
如果类需要参数,则只需将其传递给临时变量构造函数:
function(std::string("hello"));
最后,你为Java编写的内容也适用于c ++:
function(new Parameter());
但是这会在堆上分配Parameter对象,为了避免内存泄漏,你必须在函数内删除它。但这通常是一个坏主意。