C++ 为什么C++;当我们在声明变量类型时包含变量类型时,行为会有所不同吗?

C++ 为什么C++;当我们在声明变量类型时包含变量类型时,行为会有所不同吗?,c++,class,constructor,C++,Class,Constructor,所以我在类点上创建了一个构造函数 课程 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() {

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

课程

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添加变量类型时,当我声明一个构造函数,它开始这样做时,会发生什么?希望问题清楚。很高兴澄清它不是。

C++中允许你使用“影子”变量。当您对一个变量进行“阴影处理”时,您将创建一个与“外部”范围中的变量同名的新变量。现在名称引用内部变量,任何更改都不会反映在外部变量中

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

Point::Point()  {
  double x=0.0;
  double y=0.0;
}
这里,
x
y
点::x
点::y
成员变量进行阴影处理。因此
x=0.0
不会改变第一种情况下
点中的
x

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
}
评论解释了每种情况下发生的情况。
因此,在第二种情况下,当您试图访问类成员变量时,您在创建与类成员变量同名的局部变量(与类成员变量不同的内存位置)时得到了垃圾值。

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