我有一个 String 类,我想重载 + 以添加两个 String* 指针。像这样的东西不起作用:
String* operator+(String* s1, String* s2);
有什么办法可以避免通过引用传递。考虑这个例子:
String* s1 = new String("Hello");
String* s2 = new String("World");
String* s3 = s1 + s2;
我需要这种额外的工作。请建议。
我有一个 String 类,我想重载 + 以添加两个 String* 指针。像这样的东西不起作用:
String* operator+(String* s1, String* s2);
有什么办法可以避免通过引用传递。考虑这个例子:
String* s1 = new String("Hello");
String* s2 = new String("World");
String* s3 = s1 + s2;
我需要这种额外的工作。请建议。
你不能。您不能为内置类型重载运算符。无论如何,为什么要使用指针呢?尽量避免动态分配!
String s1("Hello");
String s2("World");
String s3 = s1 + s2;
这好多了,而且不会泄漏。现在你可以重载:
String operator+(const String& s1, const String& s2);
你多么渴望。这当然是浪费时间,因为std::string
存在。:)
我有一个 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 */ }
就足够了。也就是说,仅仅为了添加指针而这样做仍然是一个坏主意。
你不能只用指针重载。您需要至少具有一种类类型或枚举值。标准方法是重载两个值:
String operator+(String s1, String s2);
不确定您是否已经弄清楚了,但是String* s3 = s2 + s1;
添加了 2 个指针而不是2 个字符串,并且您无法在此处更改语义。
欢迎您拥有自己的 String 类,但请确保它是您真正需要的。在最一般的情况下, std::string 就足够了。
当你在做这件事的时候,尽量不要偏离太多,除非从标准中暴露的类似类的 API 当然有正当的理由。所以也许你可以用 1 个字符串和 1 个字符串 * 做一个 operator+,但你真的想要吗?如果人们需要维护您的代码,并且来自 STL/Boost 背景,则期望事情以某种方式工作。这有助于更轻松地进行调试。
阿潘