【发布时间】:2014-03-18 13:29:47
【问题描述】:
我最初是一名 Java 程序员,我非常喜欢语法,尤其是关于 String 对象。使用 C++,我尝试重新创建 Java 拥有的 toUpperCase() 方法。唯一的问题是它总是返回一个 String 具有空/NULL char 数组的对象。
String String::toUpperCase()
{
char *a = new char[this->length + 1];
memset(a, 0, this->capacity + 1);
memcpy(a, this->characters, this->length);
for (int i = 0; i < strlen(this->characters); i++)
{
toupper(a[i]);
}
return *new String(a);
}
【问题讨论】:
-
一般来说,使用这里的东西会更明智:stackoverflow.com/questions/735204/… 和
std::string。每次调用此函数时都会泄漏内存。另外,请阅读toupper的一些文档。 -
对字符串使用 std::string
-
另外:在 Java 和 C# 中,您经常使用
new,在 C++ 中,您应该尽可能避免使用它(无 GC)。 -
作为一般规则,不要尝试在 C++ 类中重新创建 java 类 API(它们针对 Java 进行了优化,所以你最终得到的往往是“我可以编写 C 代码”的变体任何语言”主题)。要将 C++ 字符串转换为大写,请参阅this answer。
-
另一方面,停止滥用指针(即你应该写
return String(a);而不是'return *new String(a);'并在a上使用智能指针,或者更好的是,astd::vector);另外,停止写this->。这是不必要的。还可以考虑使用std::fill代替memset和std::copy代替memcpy。