2

我为一个面向对象的 C++ 类中的赋值编写了一个小程序,我必须在其中编写一个显示复数大小的函数。以这种方式编写时它可以工作,我知道如何在参数中不带参数的情况下编写它,但我想知道代码是否存在功能问题(调用对象和参数是同一个对象)。

// displays the magnitude of a complex number
void Complex::magnitude(Complex c) const {
    cout << "\nMagnitude of "; c.display(); cout << " = ";

cout.precision(3); cout.setf(std::ios::fixed, std::ios::floatfield);
cout << sqrt(pow(static_cast<double>(c.real), 2) + 
            (pow(static_cast<double>(c.imag), 2)) ) << "\n";
} // end function magnitude

这是以 c1 作为调用对象和参数的冗余部分:

c1.magnitude(c1);

我知道如何在没有 c1 的情况下编写此代码作为幅度()的参数,而我所要做的就是删除参数并删除“c”。从函数中,它仍然可以正常工作。我的问题很简单,当这样编写程序时,这在功能上是否存在问题?

4

3 回答 3

3

您的代码在语法上毫无意义。要么使用不带参数的成员函数,要么使用带参数的独立函数(或两者)。

namespace My {
  struct Complex {
    void magnitude() const;  // member function
     ...
  };
  void magnitude(Complex const&); // free-standing function
}

这些可以这样使用

My::Complex c1;
c1.magnitude();
magnitude(c1);

(但是,使用magnitude不返回幅度的函数的名称是危险的,因此是不好的做法,最好调用它print_magnitude_to_stdout()。)

于 2013-06-16T16:38:20.930 回答
2

这在功能上不会有问题,但从逻辑上讲,如果函数必须将对象作为参数,则应该创建此函数static

此外,由于您没有修改传入的对象,因此您应该设置参数const。最后,由于复制对象可能比复制引用更昂贵,您可能希望更改要通过引用传递的参数。

static void Complex::magnitude(const Complex &c);

...

Complex myComplex(...);
Complex::magnitude(myComplex);
于 2013-06-16T16:00:44.933 回答
2

从功能上讲,您的代码是可以的,但有一个警告:您的函数按值获取参数,因此依赖于复制构造函数。如果复制 ctor 没问题,那么您的代码也没问题;否则,它可能不是。

从风格上讲,我觉得这段代码令人反感。它应该是一个无参数的成员函数,或者是一个单参数static函数(通过const引用获取它的参数)。

于 2013-06-16T16:01:22.103 回答