4

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

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

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

4

3 回答 3

17

你是对的。那就是调用类上的static方法。NewString

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

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

这是与 v8 的 String 的交易。这真有趣。

有两种实现:

浏览内部 String 源代码String确实是一个堆分配的对象,代表一个 Javascript 字符串。

事实证明,谷歌代码的用户界面坏了(也许他们有最大字符数?)。v8::internal:: HeapObject源代码应该在 中src/objects.h,但文件被截断。并且外部可见的v8::String 源代码应该在 中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);

  ...
};
于 2010-06-18T11:32:47.043 回答
5

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

但是,String该类不是标准std::string类,因为如您所见,它的大小写不同。可能它是String由其他库提供的一个类,但在不知道上下文的情况下很难说其他任何关于它的东西。


附录

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

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

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

- -编辑 - -

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

于 2010-06-18T11:33:01.583 回答
1

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

于 2010-06-18T11:33:51.557 回答