创建一个内联对象并作为参数传递
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
采用常量引用:
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});
heap.insert(new Food);
本身C++语法有效。它构造 Food
类的新实例,并将其传递给 heap 的 insert(( 方法。
但是,从 Java 过渡到 C++ 时需要了解的关键根本区别是,C++ 应用程序完全负责管理所有对象的生存期。在Java中,你不需要考虑它。一旦一个对象不再被引用到任何地方,在某些时候它就会被Java的垃圾回收器销毁。
C++让您负责管理每个对象的生存期。每当应用程序不需要在此处使用 new
运算符构造的对象时,都应将其delete
d,否则将泄漏内存。
总结一下:
heap.insert(new Food);
只是故事的一半。new
运算符将构造新的类实例,并且heap
对象的 insert(( 方法可能以某种方式存储指向新类实例的指针。在某个地方,您迟早需要delete
该类实例。
是的。你必须定义一个类,一个接受参数的构造函数,然后定义一个接受该类实例的函数,仅此而已。
最后,将适当的复制构造函数添加到类定义中或通过引用传递它。
下面是一个示例:
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概念,这是非常强大的;)
如果函数参数是按值或常量引用,并且您传递的类型可用于构造对象,则可以直接传递它。例如:
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的程序员最常犯的错误之一。
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
!
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 如何将对象数组作为参数传递给模板
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 对象作为参数传递,就好像我们正在传递构造函数值一样
- 初始化对象以在 C++08 中作为参数传递的首选语法是什么?
- 将对象作为参数传递,没有可行的重载"="
- 在将匿名对象作为参数传递时,不会调用任何构造函数
- 是否可以创建一个指向对象的智能指针并将此智能指针作为参数传递给构造函数?
- C++:将对象作为参数传递
- 将 std::ofstream 对象作为参数传递给类方法
- 将对象向量的指针作为参数传递,但差异更大
- 使用 lambda 和可变参数模板延迟初始化对象 - 任意传递值
- 当数组对象以函数参数传递时,为什么复制构造函数会自称
- 如何将对象作为参数传递
- 将对象作为C 中的参数传递
- 将新对象的名称作为参数传递
- 将对象数组作为参数传递的最佳方法是什么
- 为什么将临时对象作为参数传递需要 std::move?
- 通过引用将对象参数传递给函子