使用指针或对象重载运算符

时间:2017-08-06 03:07:25

标签: c++ pointers

我有一个名为Complex的类,其中许多成员方法返回该Complex类的对象,以及许多成员方法将类Complex的对象作为参数。

class Complex
{
public:
    Complex sampleFunc(Complex c) { ... }
    Complex operator+(Complex c) { ... }
};

这将是一个库,因此其他用户将使用我的类。因为,大多数用户使用:

Complex *ptrObj = new Complex();    // declaration 1

而不是使用:

Complex obj;                        // declaration 2

我上面编写的代码可以使用声明2,但不能使用声明1.我可以更改sampleFunc()的原型,如下所示:

Complex* sampleFunc(Complex *c) { ... }

但是我无法有意义地更改operator +()函数以获得添加两个对象的效果(而不是错误地添加两个指针)。那么,我应该暴露什么API - 适用于声明1或适用于声明2还是应该为每个函数提供两个版本?我相信传递指向函数的指针会更快,但操作符重载将是一个问题。

2 个答案:

答案 0 :(得分:3)

首先,您通常最好避免传递值,并将您的成员函数指定为接受引用

class Complex
{
  public:
     Complex sampleFunc(const Complex &c) { ... }
     Complex operator+(const Complex &c) { ... }
};

const指定函数在调用者方面不会在逻辑上更改c - 这通常与传递值相同,除了它不会创建副本传递的对象。

删除const可以更改对象。

也就是说,如果将对象的副本传递给函数而不是引用,则可以将值传递给任何您喜欢的函数。

其次,您使用其他语言的先入之见正在显示,并导致您对C ++的错误结论。具体来说,你的信念

  

这将是一个库,因此其他用户将使用我的类。因为,大多数用户使用:

Complex *ptrObj = new Complex();    // declaration 1
     

而不是使用:

Complex obj;                        // declaration 2

是假的。大多数C ++开发人员,鉴于这两个选择,将默认使用第二种形式,因为在很多情况下,第一种形式是C ++中的不良实践 - 由于完成时需要delete ptrObj,以避免内存泄漏,以及忘记这样做的可能性,特别是在非平凡的代码中。

使用库中的代码不会改变这一点。作为一个粗略的规则(并且,作为一个粗略的规则,有一些例外)如果您发现自己编写了大量使用C ++中的指针的代码(除非您正在编写标准库的版本),那么您的设计就会被破坏。

答案 1 :(得分:1)

正如您在评论中所述,您的O(g(n))类基本上是一个可变长度字符串,包含Complexchar*

然后,首先要做的是阻止此类用户执行int,因为它效率不高。你正在你的类中进行动态内存分配,所以也没有必要在外部进行(你只需添加更多的指针间接)。

您应该以传统方式编写运算符,即接受引用,而不是指针。用户通常不需要处理指针,因为您的类将动态内存抽象为实现细节。

例如:

new Complex
相关问题