在调用函数时,使用对象的同一个实例作为参数和调用对象
Using the same instance of an object as the argument and as the calling object in calling a function
我在一个面向对象的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
引用获取其参数)。
相关文章:
- 是什么让放置新调用对象的构造函数?
- 当我调用对象的方法时,对象的成员会发生变化
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 如何从构造函数副本 T(const T&)调用对象 T?
- C++17 如何保存泛型可调用对象以供以后使用
- 检查模板中 nullptr 的函数指针,了解任何类型的可调用对象
- 是否可以在编译时初始化对象的 C 样式函数指针,以便它调用对象的成员函数?
- 如何在C++中将可调用对象放入地图中?
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 广义 std::function (std::any 表示可调用对象)
- c++ 替换调用对象方法的宏函数
- 将可调用对象传递给采用 std::function 的构造函数
- 双指针在使用 new 时不调用对象构造函数
- 可调用对象作为默认模板参数
- 只需调用对象即可获取对象数据
- 如果用户尝试从 JS 调用对象的未定义函数C++则回调C++代码
- 如何将当前替代类型的 std::variant 传递给可调用对象?
- C++对象本身作为参数调用对象的方法
- 从移交的类调用对象