在C ++中创建一个没有名称的对象

时间:2017-11-10 13:29:39

标签: c++ object initialization parameter-passing

在Java中,可以执行以下操作:

function(new Parameter());

在C ++中我知道我可以这样做:

Parameter p;
function(p);

但是可以这样做:

function(Parameter p);

在C ++中?

2 个答案:

答案 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对象,为了避免内存泄漏,你必须在函数内删除它。但这通常是一个坏主意。