在调用函数时使用对象的相同实例作为参数和调用对象

时间:2013-06-16 15:58:14

标签: c++ oop

我在一个面向对象的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作为magnitude()的参数的情况下编写此代码,并且我所要做的就是删除参数并删除“c”。从功能,它仍然会起作用。我的问题只是当这样的程序编写时,这是一个功能问题吗?

3 个答案:

答案 0 :(得分: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()。)

答案 1 :(得分:2)

这在功能上不是问题,但从逻辑上讲,如果函数必须将对象作为参数,那么你应该使用这个函数static

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

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

...

Complex myComplex(...);
Complex::magnitude(myComplex);

答案 2 :(得分:2)

在功能上你的代码没问题,但有一点需要注意:你的函数按值获取参数,因此依赖于复制构造函数。如果副本是好的,你的代码就可以了;否则,可能不是。

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