【问题标题】:String::New: what is it?String::New: 它是什么?
【发布时间】:2010-06-18 11:29:33
【问题描述】:

我有 Java 背景,正在学习 C++。我遇到了以下C++代码:

String source = String::New("'Hello' + ', World'"); 

据我所知,这应该是对“String”类的静态成员函数“New”的调用。但是,我搜索了定义“String”的整个头文件,在 String 类或其超类中没有任何名为“New”的静态成员。 C++中String类或New成员函数有什么特殊含义吗?

【问题讨论】:

标签: c++ string v8 javascript-engine


【解决方案1】:

你是对的。那就是在String 类上调用static 方法New

C++(或 STL)没有原生的 String 类,一个 string 类,但它没有 ::New 方法。你必须确保你正在阅读正确的文档:)

它可能是从基类继承的,因此请确保检查 String 是否是继承层次结构的一部分。

这里是 v8 字符串的处理。很有趣。

有两种实现方式:

浏览internal String source codeString确实是一个堆分配对象,代表一个Javascript字符串。

事实证明,Google Code 的 UI 已损坏(也许它们有最大字符数?)。 v8::internal::HeapObject source code 应该在 src/objects.h 中,但文件被截断。并且外部可见的v8::String source code 应该在include/v8.h 中,但它也被截断了。

您可以下载源代码并查看文件。它是这样说的:

/**
 * A JavaScript string value (ECMA-262, 4.3.17).
 */
class V8EXPORT String : public Primitive {
 public:
   ...

 /**
   * Allocates a new string from either utf-8 encoded or ascii data.
   * The second parameter 'length' gives the buffer length.
   * If the data is utf-8 encoded, the caller must
   * be careful to supply the length parameter.
   * If it is not given, the function calls
   * 'strlen' to determine the buffer length, it might be
   * wrong if 'data' contains a null character.
   */
  static Local<String> New(const char* data, int length = -1);

  /** Allocates a new string from utf16 data.*/
  static Local<String> New(const uint16_t* data, int length = -1);

  ...
};

【讨论】:

  • 不错的信息,非常感谢。我来到这里希望将 v8 字符串转换为 stl 字符串以进行本地处理。
【解决方案2】:

您的解释是正确的,它是对 String 类的名为 New 的静态方法的调用。

但是,String 类不是标准的 std::string 类,因为您可以很容易地看到,它的大小写不同。可能是其他库提供的String 类,但在不知道上下文的情况下很难说别的。


附录

顺便说一句,是google提供的v8 Javascript引擎

好的,我发现了;您使用的那个 String 是 JavaScript 字符串的 C++ 表示,它在 V8 引擎中完全使用。你可以找到它的源代码here;我找不到任何关于它的文档,但它的评论很好。

顺便说一句,如果您刚刚接触 C++,您可能希望从更简单的东西开始,也许没有外部库,这样您就可以掌握 C++ 标准库。

---编辑---

好的,其他人在我之前发现了它。 :)

【讨论】:

    【解决方案3】:

    std::string(注意小写)是C++标准库中的一个类,定义在头文件&lt;string&gt;中。在 C++ 中,new(注意小写)是分配内存的运算符。您需要明确的第一件事是 - 您要问的是哪个字符串类?

    【讨论】:

      猜你喜欢
      • 2018-10-31
      • 1970-01-01
      • 1970-01-01
      • 2015-12-07
      • 2012-12-29
      • 2017-10-27
      • 2014-07-22
      • 2017-05-08
      相关资源
      最近更新 更多