【发布时间】:2012-07-29 17:42:25
【问题描述】:
我了解 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(在 cmets 中) 我做了以下实验。
我写了一个如下的测试类。 测试 { 上市: 测试() { cout
在主函数中我写了Test test;它输出“Test”,这意味着在不使用 new 关键字的情况下创建了一个对象。
【问题讨论】:
-
@peachykeen:不,请不要说那样的话。周围有足够多的糟糕 C++ 程序员,却没有积极推广不良做法。您确实不需要需要在 C++ 中用
new乱扔代码,这样做只是询问内存泄漏(这也是一个糟糕的 C++ 程序员的明显标志) -
@jalf 以及如何在没有新的情况下使用智能指针? oO
-
@peachykeen:谁在乎他们内部使用什么。使用内部调用
new和delete的数据结构与在高级代码中临时调用new和delete之间存在巨大差异。如果我在 RAII 类之外看到delete调用,我知道代码已损坏。如果我看到new调用,其结果没有立即传递给智能指针,我怀疑代码已损坏。而且如果我看到很多new调用,不管结果是否传递给智能指针,我都知道代码写得不好 -
@peachykeen 我只是按照你所说的去做。您说“最肯定”确实需要在 C++ 中使用
new,而事实上,它可以而且应该经常避免。您说 Java 和 C++ 在创建对象的方式上“相似”,但事实并非如此,因为在 C++ 中,您通常应该在不使用new的情况下创建对象,并且您说 C++ 要求您销毁对象明确地,这仅适用于编写不当的 C++ 代码,它过度使用new,并且无法使用 RAII。我不明白你的意思,但我不得不向像我一样阅读你评论的其他人发出警告 -
C++ 是一种危险的语言,如果你懒得去学习它。它不是“像 Java 和 C# 这样的 OO 语言”,这样对待它会导致很多痛苦和痛苦。 ;)
标签: c++