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

时间:2015-11-07 22:46:10

标签: java c++ parameters inline new-operator

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

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

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

heap.insert(new Food);

5 个答案:

答案 0 :(得分:2)

是。例如

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

通常,通常情况下,对象不作为指针给予方法。

如果heap.insert采用const引用:

void insert(const Food& val);

然后您可以将它与临时或现有的Food参数一起使用,例如

heap.insert(Food{});

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

或在某些情况下甚至

heap.insert({constructor arguments});

答案 1 :(得分: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是导致内存泄漏的最简单方法之一,所以请注意!!

答案 2 :(得分:2)

你提供的例子太容易了。

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...

但总的来说,如果你在谈论Java中的匿名类和类似的东西,C ++就有这个东西,它还有 lambda 这个非常强大的概念;)

答案 3 :(得分:2)

heap.insert(new Food);

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

但是,从Java过渡到C ++时需要学习的关键基本区别在于,C ++应用程序完全负责管理所有对象的生命周期。在Java中,你不需要考虑它。一旦某个对象不再被引用,在某些时候它将被Java的垃圾收集器摧毁。

C ++让你负责管理每个对象的生命周期。每当您的应用程序不需要使用new运算符构建的对象时,它应该是delete d,否则您将会泄漏内存。

总结:

heap.insert(new Food);

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

答案 4 :(得分:2)

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

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 ++中,new不需要创建新对象,应尽可能避免使用,因为这样可以避免内存泄漏。这是来自Java make的最常见的错误程序员之一。

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