繁体   English   中英

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

[英]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();

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM