【问题标题】:Overloading + to add two pointers重载 + 添加两个指针
【发布时间】:2010-06-14 05:32:14
【问题描述】:

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

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

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

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

String* s3 = s1 + s2;

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

【问题讨论】:

  • 你没有使用 std::string 有什么原因吗?
  • 您有 Java 或 C# 背景吗?另外,您为什么要添加两个不同 String 对象的指针,您期望 s3 的结果是什么?
  • C++ 101:不要在不需要指针时使用它们。然后你 1) 有机会避免内存泄漏,2) 获得更简洁和可读的代码,以及 3) 可以进行附加工作。

标签: c++ overloading operator-keyword


【解决方案1】:

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

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

String s3 = s1 + s2;

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

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

如你所愿。这当然是浪费时间,因为存在std::string。 :)

【讨论】:

  • "您不能为内置类型重载运算符。"标准中是否提到了这一事实?在哪里?
  • @6pack 是语言的基本原理。 C++ 应该是可扩展的,但不是可变的。
【解决方案2】:

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

String operator+(String s1, String s2);

【讨论】:

    【解决方案3】:

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

    为什么?

    这样的事情是行不通的:

    String* 运算符+(String* s1, String* s2);

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

    有什么办法可以避免路过 参考。

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

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

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

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

    考虑这个例子:

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

    字符串* s3 = s1 + s2;

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

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      阿潘

      【讨论】:

        猜你喜欢
        • 2017-12-13
        • 2015-12-14
        • 1970-01-01
        • 2014-07-29
        • 1970-01-01
        • 1970-01-01
        • 2013-02-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多