c++ class setter 当参数名和变量名相等时设置不同的变量

c++ class setter sets variables different when argumentname and variable name are equal

我完全是 c++ 的新手,我发现了一些我不明白的东西,我找不到答案(而且我确信它已经被问了很多,所以给我指出一个线程也会乖一点)。

示例代码:

#include <iostream>

    class Car {
        int doors;

        public:
            void set_doors(int doors){
                doors = doors;
            }

            int get_doors(){
                return doors;
            }
    };

    int main()
    {
        Car ford;
        ford.set_doors(3);
        std::cout << ford.get_doors() << std::endl;
    } 

所以当我 运行 代码时,它 returns 总是一个长度为 9 的整数。

我知道问题正在发生,因为在

void set_doors(int doors) 

我对要更改的参数和变量使用相同的名称。 如果我将代码更改为

  void set_doors(int newdoors){
   doors = newdoors;
  }

一切都会完美。

我的问题是: 当使用我想修改的变量的名称和参数名称时,为什么代码会这样? 请用简单的方式解释一下;)

谢谢

最佳

Why does the code behave like this, when using the name for the variable which I like to modify and the argument name?

因为 C++ 的规则要求它以这种方式运行:局部变量和参数的名称 "win" 在成员变量之上。你应该在这个赋值上得到一个编译器警告,说这个赋值没有效果(它将参数的值赋回给它自己)。

解决此问题的惯用方法之一如下:

this->doors = doors;

当一个不合格的名称可能指代多个事物时,这就是该语言让您解决问题的方式。

你的代码有未定义的行为,因为你试图读取一个未初始化的变量。在以下函数中:

void set_doors(int doors){
  doors = doors;
}

doors总是指函数参数,指成员变量。换句话说,您自行分配函数参数并且您的 doors 成员变量保持不变。更糟糕的是成员变量从未被初始化。在 get_doors 中阅读它会产生 9 纯属巧合。该程序可以做任何事情。

您可以像这样修复 setter 函数:

void set_doors(int doors){
    this->doors = doors;
}

不过,您的 class 很容易被错误使用,因为在 get_doors 实际工作之前必须调用 set_doors 并不明显。您想在构造函数中将 doors 初始化为 0

class Car {
    int doors;

public:
    Car() : doors(0) {}

    void set_doors(int doors){
        this->doors = doors;
    }

    int get_doors(){
        return doors;
    }
};

一旦进入函数 get_doors,参数 'doors' 就会隐藏成员变量 'doors'。所以赋值'doors = doors'基本上是把函数参数doors赋值给doors,成员变量还是未定义。

此外,我最好不要这样设计 class,我宁愿在构造函数中设置 class 成员变量。
*

  • Class汽车{ 内部门; public: 汽车(内部门):门(门){} int get_door_count(){ return 门; } };

*
请注意,在这种情况下,编译器可以在使用成员初始化语法时正确区分函数参数门和成员变量门。