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

Using the same instance of an object as the argument and as the calling object in calling a function

本文关键字:调用 对象 实例 参数 同一个 函数      更新时间:2023-10-16

我在一个面向对象的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.",它仍然可以正常工作。我的问题很简单当程序像这样编写时,这在功能上是一个问题吗?

你的代码在语法上没有意义。要么使用不带实参的成员函数,要么使用带实参的独立函数(或两者都有)。

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()。)

这在功能上不是问题,但从逻辑上讲,如果函数必须接受一个对象作为参数,则应该将此函数设置为static

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

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

从功能上讲,您的代码没有问题,但有一点需要注意:您的函数按值接受参数,因此依赖于复制构造函数。如果复制器没问题,你的代码就没问题;否则,可能不是。

从风格上看,我觉得这段代码令人反感。它要么是一个无参数的成员函数,要么是一个只有一个参数的static函数(通过const引用获取其参数)。