我来自 Java 背景,正在学习 C++。我遇到了以下 C++ 代码:
String source = String::New("'Hello' + ', World'");
据我所知,这应该是对类“String”的静态成员函数“New”的调用。但是,我搜索了定义“String”的整个头文件,在 String 类或其超类中没有任何名为“New”的静态成员。String 类或 C++ 中的 New 成员函数有什么特殊含义吗?
我来自 Java 背景,正在学习 C++。我遇到了以下 C++ 代码:
String source = String::New("'Hello' + ', World'");
据我所知,这应该是对类“String”的静态成员函数“New”的调用。但是,我搜索了定义“String”的整个头文件,在 String 类或其超类中没有任何名为“New”的静态成员。String 类或 C++ 中的 New 成员函数有什么特殊含义吗?
你是对的。那就是调用类上的static
方法。New
String
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);
...
};
New
您的解释是正确的,它是对类的静态方法的调用String
。
但是,String
该类不是标准std::string
类,因为如您所见,它的大小写不同。可能它是String
由其他库提供的一个类,但在不知道上下文的情况下很难说其他任何关于它的东西。
顺便说一句,它是 google 提供的 v8 Javascript 引擎
好的,我发现了;您使用的那个 String 是 JavaScript 字符串的 C++ 表示,它在 V8 引擎中完全使用。你可以在这里找到它的源代码;我找不到任何关于它的文档,但它的评论很好。
顺便说一句,如果你刚刚接触 C++,你可能想从更简单的东西开始,也许没有外部库,这样你就可以掌握 C++ 标准库。
- -编辑 - -
好的,有人在我之前发现了它。:)
该类std::string
(注意小写)是 C++ 标准库中的一个类,在头文件中定义<string>
。在 C++new
中(注意小写)是分配内存的运算符。您需要明确的第一件事是 - 您要问的是哪个字符串类?