有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java创建内联对象并作为参数传递

您好,我来自Java,以下内容有效:

System.out.println(new String("Hello World"));

是否有一个C++等价于在构造函数中创建对象或指针,并同时传递它作为一个参数,例如.

heap.insert(new Food);

共 (5) 个答案

  1. # 1 楼答案

    你举的例子太简单了

    cout << string("hello World");
    // not necessary to contruct a string, but to show that it can be done on the spot
    
    heap.insert(Food()); // construct a Food on the spot...
    

    但一般来说,如果你在爪哇讨论匿名类和类似的东西,C++有这种东西,它也有 lambda 概念,非常强大;p>

  2. # 2 楼答案

    对。您必须定义一个类,一个接受参数的构造函数,然后是一个接受该类实例的函数,仅此而已

    最后,向类定义中添加一个适当的复制构造函数或通过引用传递它

    下面是一个例子:

    struct S {
        S(int x) { this->x = x; }
        int x;
    };
    
    void fn(S s) { }
    void cfn(const S &s) { }
    
    int main() {
        fn(S{42});
        cfn(S{42});
    }
    

    请注意,在这种情况下使用new是导致内存泄漏的最简单方法之一,因此请注意

  3. # 3 楼答案

    heap.insert(new Food);
    

    本身是有效的C++语法。它构造了Food类的一个新实例,并将其传递给heap的insert()方法

    <>但是,当从java转换到C++时,你需要学习的关键根本区别是C++应用程序完全负责管理所有对象的生命周期。在Java中,您不需要考虑它。一旦一个对象不再在任何地方被引用,在某个时候它就会被Java的垃圾收集器破坏

    C++使你负责管理每个对象的生命周期。每当应用程序不需要您在此处使用new运算符构造的对象时,它应该是deleted,否则将导致内存泄漏

    总结如下:

    heap.insert(new Food);
    

    这只是故事的一半。new操作符将构造新的类实例,而heap对象的insert()方法可能以某种方式存储指向新类实例的指针。在某个地方,您迟早需要delete该类实例

  4. # 4 楼答案

    如果函数参数是按值或按常量引用,并且您要传递的类型可用于构造对象,则可以直接传递它。例如:

    void print(const std::string& str);
    
    int main()
    {
        print("Hello world");
    }
    

    std::string有一个可以接受字符串文字的构造函数,因此代码会编译,创建一个临时字符串对象,相当于:

    print(std::string("Hello world"));
    

    如果构造函数接受多个参数,则可以直接在函数调用中创建临时对象。例如:

    void myfunc(const MyClass& c);
    
    myfunc(MyClass(param1, param2));
    

    在Java中,使用new创建新对象。在C++中,不需要创建{{CD2}}来创建新的对象,并且应该尽可能避免,因为这样会更难避免内存泄漏。这是Java程序员最常见的错误之一

    std::string text;
    MyClass c;
    c.do_something();
    

    此代码完全有效textc是有效对象

    std::string *text = new std::string();
    MyClass *c = new MyClass();
    c->do_something();
    delete text;
    delete c;
    

    此代码也是有效的*。但这需要更多的输入,如果你忘记删除它们,你会得到内存泄漏

    *编辑:实际上它不是异常安全的!更应该避免new

  5. # 5 楼答案

    对。比如说

    std::vector<Food> c;
    c.emplace_back(constructor arguments for Food);
    

    一般来说,对象通常不作为指针提供给方法

    如果heap.insert采用常量引用:

    void insert(const Food& val);
    

    然后您可以将其用于临时或现有的食物参数,例如

    heap.insert(Food{});
    
    var auto foo = Food{constructor arguments};
    heap.insert(foo);
    heap.insert(Food(constructor arguments));
    

    甚至在某些情况下

    heap.insert({constructor arguments});