我完全不熟悉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;
}
因此,当我运行代码时,它总是返回一个长度为9的int。
我知道问题正在发生,因为
void set_doors(int doors)
我使用相同的名称作为参数和我想要改变的变量。 如果我将代码更改为
void set_doors(int newdoors){
doors = newdoors;
}
一切都会完美无缺。
我的问题是: 当使用我想修改的变量的名称和参数名称时,为什么代码的行为与此类似? 请以简单的方式解释;)
谢谢
最佳
答案 0 :(得分:2)
当使用我想修改的变量的名称和参数名称时,为什么代码的行为如此?
因为C ++的规则要求它以这种方式运行:局部变量和参数的名称“胜过”成员变量。你应该在这个赋值上得到一个编译器警告,说该赋值没有效果(它将参数的值赋给它自己)。
解决此问题的惯用方法之一如下:
this->doors = doors;
当非限定名称可以引用多个内容时,这种语言可以让您解决问题。
答案 1 :(得分:0)
您的代码具有未定义的行为,因为您尝试读取未初始化的变量。在以下功能中:
void set_doors(int doors){ doors = doors; }
doors
总是将函数参数 not 引用到成员变量。换句话说,您自行分配函数参数,而您的doors
成员变量保持不变。更糟糕的是,成员变量永远不会被初始化。在get_doors
中阅读它会产生9
只能在你的机器上完全巧合。该计划可以做任何事情。
您可以像这样修复您的setter函数:
void set_doors(int doors){
this->doors = doors;
}
尽管如此,您的课程使用起来会非常容易,因为在set_doors
实际运作之前,我们不得不调用get_doors
。您想在构造函数中将doors
初始化为0
:
class Car {
int doors;
public:
Car() : doors(0) {}
void set_doors(int doors){
this->doors = doors;
}
int get_doors(){
return doors;
}
};
答案 2 :(得分:0)
一旦进入函数get_doors,参数'doors'就会隐藏成员变量'doors'。所以赋值'doors = doors'基本上将函数参数门分配给门,而成员变量仍未定义。
另外,理想情况下我不会这样设计类,我宁愿在构造函数中设置类成员变量。
* 的
*
的
请注意,在这种情况下,编译器可以在使用成员初始化语法时正确区分函数参数门和成员变量门。