【问题标题】:Create an object without a name in C++在 C++ 中创建一个没有名称的对象
【发布时间】:2017-11-10 13:29:39
【问题描述】:

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

function(new Parameter());

在 C++ 中我知道我可以做到:

Parameter p;
function(p);

但是有没有可能做这样的事情:

function(Parameter p);

在 C++ 中?

【问题讨论】:

    标签: c++ object initialization parameter-passing


    【解决方案1】:

    是的。与 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 的演讲。如果您不跳过这些环节,而是尝试多态地使用值对象,那么您最终可能会遇到对象切片。

    【讨论】:

      【解决方案2】:

      是的,你可以做这样的事情。由于这是一个临时变量,因此您无需像在 Java 中那样命名它。

      语法是:

      function(Parameter());
      

      如果类需要参数,你只需将它传递给临时变量构造函数:

      function(std::string("hello"));
      

      最后,您为 Java 编写的内容也可以在 c++ 中使用:

      function(new Parameter());
      

      但这会在堆上分配参数对象,为了避免内存泄漏,你必须在函数内部删除它。但这通常是个坏主意。

      【讨论】:

        猜你喜欢
        • 2013-03-23
        • 2013-04-05
        • 1970-01-01
        • 2010-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多