gpt4 book ai didi

c++ - 如何在 C++ 中创建对象?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:19:36 24 4
gpt4 key购买 nike

我了解 Java,但对 C++ 了解不多。我正在尝试为 https://developers.google.com/v8/get_started 处代码的主要函数中的前 3 个语句编写一个类。 .

首先,我对如何在 C++ 中创建对象有疑问。请参见下面的代码。

HandleScope handle_scope;
Persistent<Context> context = Context::New();
Context::Scope context_scope(context);

我认为在 C++ 中,当您声明一个类的变量时,它就是此时创建的类的一个实例。您不需要像在 Java 中那样使用 new 关键字。所以第一条语句将创建一个 HandleScope 实例,该实例将存储在 handle_scope 中。现在我不明白第二个陈述是如何工作的。据我所知, = 之前的部分将创建一个新的持久对象,该对象可以由变量上下文引用。那么 Context::New() 会创建一个新对象并将其存储在上下文中吗?呵呵,我知道我错了。但我根本不明白它是如何工作的?

我正在尝试为上述内容编写一个 C++ 类。这是我的尝试。

class MyClass {
private:
HandleScope handle_scope;
Persistent<Context> context;
Context::Scope context_scope;

public:
MyClass();
};

MyClass::MyClass()
{
context = Context::New();
context_scope = new Context::Scope(context);
}

我是否正确完成了初始化?

编辑:回复 peachykeen(在评论中)我做了以下实验。

我写了一个测试类如下。 测试 { 民众: 测试() { cout << "测试"<< endl; } };

在main函数中我写了Test测试;它输出“Test”,这意味着在不使用 new 关键字的情况下创建了一个对象。

最佳答案

你是对的,在 C++ 中,对象一定义就创建。您不需要使用 new 关键字。

然而,与 Java 不同的是,可以创建具有不同持续时间的对象。使用 new 在堆上创建一个对象,具有动态 存储持续时间:变量一直存在,直到您显式删除 它。 (并且 new 返回一个指向创建对象的指针,以便您可以跟踪它)

如果您只是简单地定义一个对象,如第一行和第三行,那么它会以自动 存储持续时间创建:也就是说,该对象一直存在,直到它超出范围。

这意味着您可以在函数内部创建对象,并且保证一旦您离开函数它们就会被销毁 -- 无论您如何离开功能。无论您是返回还是抛出异常,所有具有自动存储持续时间的对象(在不使用 new 的情况下创建)都保证被正确清理。

这意味着您应该尽可能避免new。如果您必须使用 new,您通常应该将结果指针包装到一个智能指针类中,这是一个使用自动存储持续时间创建的对象,以便自动销毁)。然后,智能指针将自动对新分配的对象调用 delete,再次确保您不会泄漏内存。

这种区别是一个非常强大的工具,优秀的 C++ 程序员需要很好地理解它。它是避免内存泄漏,或更一般地说,避免各种资源泄漏的关键,并且在某些方面,它比 Java 的垃圾收集器更强大。

例如,假设我们希望打开一个文件,然后向其中写入一些数据。在 C++ 中,我们可以这样做:

void foo() {
std::ofstream file("foo.txt");
doStuff(file); // call a function which does something with the file
}

并且因为 file 是在没有使用 new 的情况下声明的,因为它具有自动存储持续时间,我们保证当它超出范围时,它将调用其析构函数,并且将被正确清理——也就是说,流将被刷新,文件句柄将被关闭。

doStuff 是否抛出异常并不重要。 无论我们如何离开foofile 都会被正确销毁,所以我们不需要搞乱try/finally 就像在 Java 中一样。该类本身是异常安全的,不需要用户做任何额外的工作。

尝试用 Java 编写一个类似的片段,其中一个保证即使 doStuff 抛出异常,文件也会立即关闭。它会更长,并且需要用户更多的关注。

关于c++ - 如何在 C++ 中创建对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11711482/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com