【问题标题】:Why does the constructor in C++ behave differently when we include variable types while declaring it?为什么当我们在声明变量类型时包含变量类型时,C++ 中的构造函数的行为会有所不同?
【发布时间】:2018-10-15 20:19:46
【问题描述】:

所以我在 Point 类上创建了一个构造函数。

class Point {
public:
    Point(); //declare default constructor
    double x;
    double y;
};

构造函数

Point::Point()  {
  x=0.0;
  y=0.0;
}

现在,当我在 main 中打印 x 和 y 的默认值时,它们显示为 0 和 0,这是我所期望的。

不过,为了好玩,将构造函数的声明更改为以下 -

新构造函数声明

Point::Point()  {
  double x=0.0;
  double y=0.0;
}

现在,当我调用同一个构造函数时,我得到的 x 和 y 的值分别为 2.16703e-314 和 6.95313e-310。现在,我知道构造函数的用途了。我想知道的是,当我将变量类型添加到 x 和 y 时,当我声明它开始表现得这样的构造函数时会发生什么?希望问题很清楚。很高兴澄清是否不是。

【问题讨论】:

  • 您的 double x 现在是一个局部变量,被设置为 0.0,而不是成员变量,这意味着成员变量 (this->x) 从未显式初始化。
  • 您的第二个示例仅初始化局部变量而不是成员 variaböls。

标签: c++ class constructor


【解决方案1】:

在 C++ 中,您可以“隐藏”变量。当您“隐藏”一个变量时,您会创建一个与“外部”范围内的变量同名的新变量。现在名称指的是内部变量,任何更改都不会反映在外部变量中。

具有适当警告设置的编译器会在您执行此操作时告诉您。

Point::Point()  {
  double x=0.0;
  double y=0.0;
}

这里,xy 隐藏了 Point::xPoint::y 成员变量。所以x=0.0 不会改变Point 中的x

【讨论】:

    【解决方案2】:

    第一种情况

    Point::Point() {
      x=0.0;  // refers to class member variable x 
      y=0.0;  // refers to class member variable y
    }
    

    第二种情况

    Point::Point()  {
      double x=0.0; //Creating local variable with same name as class member variable
      double y=0.0; //Creating local variable with same name as class member variable
    }
    

    cmets 解释了每种情况下发生的情况。 因此,在第二种情况下,当您尝试访问类成员变量时,您会得到垃圾值,因为您正在创建一个与类成员变量同名的局部变量(与类成员变量相比,内存位置不同)。

    【讨论】:

      猜你喜欢
      • 2021-06-11
      • 2014-11-09
      • 2020-05-31
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多