您好我来自Java,其中以下内容有效:
System.out.println(new String("Hello World"));
是否有一个C ++等效于在构造函数中传递创建对象或指针,并将其作为参数同时传递,例如。
heap.insert(new Food);
答案 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();
此代码完全有效。 text
和c
是有效的对象。
std::string *text = new std::string();
MyClass *c = new MyClass();
c->do_something();
delete text;
delete c;
此代码也有效*。但它需要更多的输入,如果你忘记删除它们,你将会出现内存泄漏。
*编辑:其实不是例外安全!更有理由避免new
!