[英]Create an inline object and pass as parameter
嗨,我来自Java,以下内容有效:
System.out.println(new String("Hello World"));
是否有C ++等效于在构造函数中通过创建对象或指针并将其作为参数同时传递,例如。
heap.insert(new Food);
是。 例如
std::vector<Food> c;
c.emplace_back(constructor arguments for Food);
通常,最常见的情况是没有将对象作为指针提供给方法。
如果heap.insert
采用const引用:
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});
是。 您必须定义一个类,一个接受参数的构造函数,然后是一个接受该类实例的函数,仅此而已。
最终,将适当的复制构造函数添加到类定义中,或通过引用将其传递。
下面是一个示例:
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
是导致内存泄漏的最简单方法之一,因此请注意!!
您提供的示例太简单了。
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概念;)
heap.insert(new Food);
本身就是有效的C ++语法。 它构造了Food
类的新实例,并将其传递给堆的insert()方法。
但是,从Java过渡到C ++时需要学习的主要根本区别是C ++应用程序完全负责管理所有对象的生命周期。 在Java中,您无需考虑。 一旦不再在任何地方引用对象,在某个时候它将被Java的垃圾收集器销毁。
C ++让您负责管理每个对象的生命周期。 每当您的应用程序不需要使用new
运算符在此处构造的对象时,都应将其delete
d,否则将泄漏内存。
总结一下:
heap.insert(new Food);
只是故事的一半。 new
运算符将构造您的新类实例,并且您的heap
对象的insert()方法大概以某种方式存储指向新类实例的指针。 然后,您将需要早晚delete
该类实例。
如果函数参数是按值或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
来创建新对象,并且应尽可能避免使用new,因为这样做会使避免内存泄漏变得更加困难。 这是Java程序员最常犯的错误之一。
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
理由!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.