0

我有一个 String 类,我想重载 + 以添加两个 String* 指针。像这样的东西不起作用:

String* operator+(String* s1, String* s2);

有什么办法可以避免通过引用传递。考虑这个例子:

String* s1 = new String("Hello");
String* s2 = new String("World");

String* s3 = s1 + s2;

我需要这种额外的工作。请建议。

4

4 回答 4

8

你不能。您不能为内置类型重载运算符。无论如何,为什么要使用指针呢?尽量避免动态分配!

String s1("Hello");
String s2("World");

String s3 = s1 + s2;

这好多了,而且不会泄漏。现在你可以重载:

String operator+(const String& s1, const String& s2);

你多么渴望。这当然是浪费时间,因为std::string存在。:)

于 2010-06-14T05:37:23.417 回答
2

我有一个 String 类,我想重载 + 以添加两个 String* 指针。

为什么?

像这样的东西不起作用:

字符串*运算符+(字符串* s1,字符串* s2);

这是 C++ 的核心功能。你不能那样改变它。

有什么办法可以避免通过引用传递。

您可以通过引用、指针或值传递。

按价值计算效率低下(因为没有正当理由创建和复制临时对象*)

在这种情况下,按指针不可用(添加指针是核心语言功能)。事实上,语言中添加了引用,以将指针作为参数(给重载运算符)传递的效率与传递值的便捷语法结合起来。换句话说,参考是根据您的具体情况创建的语言功能。它们是最佳解决方案。

通过引用是通常接受的解决方案。您能告诉我们为什么这对您的情况不利吗?

考虑这个例子:

String* s1 = new String("你好"); String* s2 = new String("世界");

字符串* s3 = s1 + s2;

这看起来像 Java 或 C# 代码,翻译成 C++ 语法。不要那样做。这种心态被称为“我可以用任何语言编写 C 语言”,它通常会将您尝试移植到 C++ 的任何心态的固有问题与 C++ 的固有问题相结合,而没有两者的优点。

我不是说你正在这样做,我只是说要确保你还没有这样做:)。

我需要这种额外的工作。请建议。

你可以定义一个额外的智能指针类来保存你的字符串。它不需要做太多(只需 astruct ptr { String* _value; /* add your syntax sugar and operators here */ }就足够了。也就是说,仅仅为了添加指针而这样做仍然是一个坏主意。

于 2010-06-14T09:14:03.970 回答
2

你不能只用指针重载。您需要至少具有一种类类型或枚举值。标准方法是重载两个值:

String operator+(String s1, String s2);
于 2010-06-14T05:37:00.923 回答
1

不确定您是否已经弄清楚了,但是String* s3 = s2 + s1;添加了 2 个指针而不是2 个字符串,并且您无法在此处更改语义。

欢迎您拥有自己的 String 类,但请确保它是您真正需要的。在最一般的情况下, std::string 就足够了。

当你在做这件事的时候,尽量不要偏离太多,除非从标准中暴露的类似类的 API 当然有正当的理由。所以也许你可以用 1 个字符串和 1 个字符串 * 做一个 operator+,但你真的想要吗?如果人们需要维护您的代码,并且来自 STL/Boost 背景,则期望事情以某种方式工作。这有助于更轻松地进行调试。

阿潘

于 2010-06-14T06:48:49.163 回答