C++ 为什么会返回意外值? #包括 使用名称空间std; 分类 { 公众: int数据; 某些东西(int数据) { 数据=数据// } }; int main() { 某物s=某物(4); 库特 我认为这是一个非常糟糕的编码方法。你已经定义了一个重写类级别变量的方法,这真是一个坏主意。要解决这个问题,你可以做两件事之一: Something(int data) { data = data; // }

C++ 为什么会返回意外值? #包括 使用名称空间std; 分类 { 公众: int数据; 某些东西(int数据) { 数据=数据// } }; int main() { 某物s=某物(4); 库特 我认为这是一个非常糟糕的编码方法。你已经定义了一个重写类级别变量的方法,这真是一个坏主意。要解决这个问题,你可以做两件事之一: Something(int data) { data = data; // },c++,C++,我做第一个。我认为隐藏类变量是有害的,但你会发现很多代码做第二个,至少在构造函数中是这样。很多IDE会将此标记为警告。你应该更喜欢初始化而不是赋值: Something(int _data) { data = _data; // } Something(int data) { this->data = data; // } 在您的代码中,data是局部变量,即传递给构造函数的参数。您将data的值赋给data,而这实际上不起任何作用 这里的:data(data)是构造函

我做第一个。我认为隐藏类变量是有害的,但你会发现很多代码做第二个,至少在构造函数中是这样。很多IDE会将此标记为警告。

你应该更喜欢初始化而不是赋值:

Something(int _data)
{
    data = _data; //
}

Something(int data)
{
    this->data = data; //
}
在您的代码中,
data
是局部变量,即传递给构造函数的参数。您将
data
的值赋给
data
,而这实际上不起任何作用


这里的
:data(data)
是构造函数初始值设定项列表的特殊语法。
data(…)
是类成员,而
…(data)
是参数。请注意,这是一种特殊情况,在这种情况下,您可以通过完全相同的名称引用两个不同的变量。您仍然可以为参数使用不同的名称,您的选择仅基于您必须遵守的意见、个人表现和可能的编码标准。

数据=数据;
设置本地变量能够将
data
设置为局部变量
data
的值。不是很有用,但允许。它不会修改同名的类成员,因为它被阴影覆盖。我会使名称不同(不需要,但不太容易混淆),并使用构造函数初始值设定项列表。
Something(int data){data=data;}
想变成
Something(int-data):data(data){}
Something(int-data):data(data){}
是处理此问题的首选方法,无需重命名任何内容。那么,对于
data
指的是类成员,而
data
指的是构造函数参数,就没有任何歧义。@RemyLebeau啊,你是对的。有3种方法可以解决此问题。就我个人而言,我仍然不喜欢它,并且仍然会将其作为_-dat传递a、 @RemyLebeau即使使用成员初始值设定项列表,使用不同的名称仍然是合理的,以避免正文或其他初始值设定项中的混淆。不过,我同意,使用初始值设定项列表应该是首选。@胡桃木您可以使用类似的参数作为相反的参数,更多的名称意味着更容易混淆。在
Something(int data)中:data(data){}
没有办法混淆这两者我个人的想法很简单:不要重载变量名。永远不要。你可能会侥幸逃脱,但这也是一种很好的方法,可以让你产生无法理解的错误。
Something(int _data)
{
    data = _data; //
}

Something(int data)
{
    this->data = data; //
}
Something(int data) : data(data) {}