【问题标题】:Passing a value to an object of the class, how is that possible?将值传递给类的对象,这怎么可能?
【发布时间】:2021-09-16 06:16:01
【问题描述】:
#include <iostream>
using namespace std;
  
class Complex
{
private:
    double real;
    double imag;
  
public:
   
    Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}
  
    bool operator == (Complex rhs) {
       return (real == rhs.real && imag == rhs.imag)? true : false;
    }
};
  
int main()
{
    Complex com1(3.0, 0.0);
  
    if (com1 == 3.0)
       cout << "Same";
    else
       cout << "Not Same";
     return 0;
}

这里,

if (com1 == 3.0)

我们将 3.0 传递给 Complex 类的对象 rhs,但这怎么可能呢?一个对象不能只有一个值,不是吗?

另外,如果 rhs = 3.0 是不可能的,那么可能会调用 Complex 类的构造函数,但这里的构造函数需要两个参数,而我们只传递一个参数??

这个例子取自-https://www.geeksforgeeks.org/g-fact-93/

【问题讨论】:

  • operator == 应该是 constreturn cond ? true : false; 可能只是 return cond;
  • 您认为i = 0.0 位做了什么?当默认参数在构造函数以外的函数中使用时,你能识别它们吗?
  • @Useless 哦,我现在明白了,是的,现在我认识到 img = 0.0 很抱歉没有看到,但如果 img = 0.0 不存在,这会给我一个错误正确的?因为没有为 img 初始化任何值。
  • 如果构造函数参数(嗯,第二个)没有默认,那么这个构造函数就没有资格将双精度3.0转换为临时Complex{d, 0.0},没错。跨度>

标签: c++ class object


【解决方案1】:

可以使用一个参数调用的非explicit 构造函数是converting constructor

Complex(double r = 0.0, double i = 0.0); 

由于这个构造函数有default arguments,我们可以用零、一个或两个参数来调用它。因此,它可以充当转换构造函数

所以,在com1 == 3.0,实际上是com1.operator==(3.0)中,3.0被转换为Complex类型,换句话说,我们使用参数3.0创建Complex的实例:

Complex(3.0); // real = 3.0, imag = 0.0 (default value)

当我们比较时,两个对象的实部和虚部都相等(3.0 == 3.0),并且由于构造函数中的默认参数,新创建的对象的imag 部分被初始化为0.0

你可以通过构造函数explicit来避免这种情况:

explicit Complex(double r = 0.0, double i = 0.0);

作为旁注,一般来说,相等运算符应该是一个非成员(朋友)函数,它需要两个对 const 类型对象的引用。此外,当您可以返回比较的直接结果时,无需返回布尔文字。

【讨论】:

  • 所以当我将 3.0 传递给 rhs 对象时,它被传递给了具有两个参数的构造函数,所以只有一个参数用于初始化 real = r = 3.0 和 img = i = 0.0 被初始化为零? ?
  • 当函数有两个 args 并且我只传递一个 arg 时,第一个用该值初始化,其余的初始化为零是不是这样?这是规定吗?
  • @shockproof 因为这个特定的构造函数不是explicit 并且可以使用一个显式传递的参数来调用,所以它用于这种隐式转换。传递的3.0(来自比较的那个)用于初始化第一个参数(real 部分),覆盖默认参数。 imag 部分是从保留的默认参数初始化的。
  • @shockproof 不,你的构造函数有默认参数(0.0),这就是为什么 imag 被初始化为 0.0
  • 所以如果我对构造函数使用显式关键字,这肯定会给我一个错误,因为 rhs = 3.0 是不可能的,对吧?
【解决方案2】:

您的Complex 构造函数不是explicit,因此将调用Complex 的构造函数。另外,你默认有i == 0.0,你的构造函数会像Complex(3.0)一样被调用。

【讨论】:

  • @Jarod42 哎呀... <.>
猜你喜欢
  • 2012-03-30
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 2021-01-01
  • 1970-01-01
相关资源
最近更新 更多