我有一个String类,我想重载+来添加两个String *指针。 这样的事情不起作用:
String* operator+(String* s1, String* s2);
有没有办法避免通过引用传递。 考虑这个例子:
String* s1 = new String("Hello");
String* s2 = new String("World");
String* s3 = s1 + s2;
我需要这种额外的工作。请建议。
答案 0 :(得分:8)
你做不到。您不能为内置类型重载运算符。无论如何,为什么要使用指针呢?尽可能避免动态分配!
String s1("Hello");
String s2("World");
String s3 = s1 + s2;
那好多了,不泄漏。现在你可以重载:
String operator+(const String& s1, const String& s2);
你的愿望。当然,这是浪费时间,因为std::string
存在。 :)
答案 1 :(得分:2)
你不能只用指针重载。您需要至少有一个类类型或枚举值。标准方法是重载两个值:
String operator+(String s1, String s2);
答案 2 :(得分:2)
我有一个String类,我想 重载+添加两个字符串* 指针。
为什么?
这样的事情不起作用:
String * operator +(String * s1,String * S2);
这是c ++核心功能。你无法改变它。
有没有办法避免路过 参考
您可以通过引用,指针或值传递。
按价值效率低下(因为没有正当理由而临时创建和复制*)
指针在这种情况下不可用(添加指针是核心语言功能)。事实上,引用被添加到语言中,以将传递指针作为参数(重载运算符)的效率与传递值的方便语法相结合。换句话说,引用是根据您的具体情况创建的语言功能。它们是最佳解决方案。
通过引用是通常接受的解决方案。你能告诉我们为什么你的情况不好吗?
考虑这个例子:
String * s1 = new String(“Hello”); String * s2 = new String(“World”);
String * s3 = s1 + s2;
这看起来像Java或C#代码,翻译成C ++语法。 不要那样做。这种心态被称为“我可以使用任何语言编写C语言”,它通常会将您尝试移植到C ++中的任何心态的固有问题与C ++的固有问题相结合,而没有任何优势。
我不是说你这样做,我只是说要确保你还没有这样做:)。
我需要这种额外的工作。 请建议。
您可以定义一个额外的智能指针类来保存字符串。它不需要做太多(仅struct ptr { String* _value; /* add your syntax sugar and operators here */ }
就足够了。也就是说,仅仅为了添加指针,这仍然是一个坏主意。
答案 3 :(得分:1)
不确定您是否已经明白这一点,但String* s3 = s2 + s1;
添加2个指针且不 2个字符串,并且您无法更改语义在这里。
欢迎您拥有自己的String类,但请确保您确实需要它。在最一般的情况下,std :: string就足够了。
当你在它的时候,尽量不要偏离太多,除非当然有来自标准的类似类的暴露API的正当理由。所以也许你可以用1个字符串和1个字符串*做一个操作符+,但你真的想要吗?如果人们需要维护你的代码,并且来自STL / Boost背景,那么期望事情就是以某种方式工作。这有助于调试更轻松。
Arpan