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

Cra*_*ker 1 c++

我认识Java,但对C++知之甚少.我正在尝试为https://developers.google.com/v8/get_started上代码的主要功能编写前3个语句的类.

首先,我对如何在C++中创建对象有疑问.请参阅以下代码.

HandleScope handle_scope;
Persistent<Context> context = Context::New();
Context::Scope context_scope(context);
Run Code Online (Sandbox Code Playgroud)

我认为在C++中,当你声明一个类的变量时,就会在该点创建一个类的实例.您不需要在Java中使用new关键字.因此,第一个语句将创建一个HandleScope实例,该实例将存储在handle_scope中.现在我不明白第二个陈述是如何起作用的.根据我的知识,在=之前的部分将创建一个新的Persistent对象,可以通过变量context来引用它.然后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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

我写了一个Test类,如下所示.测试{public:Test(){cout <<"Test"<< endl; }};

在主要功能中我写了Test test; 它输出"Test",表示在不使用new关键字的情况下创建对象.

jal*_*alf 11

你是对的,在C++中,对象是在定义后立即创建的.您不需要使用new关键字.

但是,与Java不同,可以使用不同类型的持续时间创建对象.使用new在堆上创建一个具有动态存储持续时间的对象:变量一直存在,直到您明确delete它为止.(并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   
}
Run Code Online (Sandbox Code Playgroud)

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

是否doStuff可能抛出异常并不重要.不管如何,我们离开foo,file将被适当地破坏,所以我们并不需要做手脚try/ finally就像你在Java中那样.该类本身是异常安全的,无需用户的任何额外努力.

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