如何在构造函数中访问类变量以分配它们,而无需在C++中使用此指针

how to access class variable inside a constructor to assign them without using this pointer in C++

本文关键字:C++ 指针 访问 构造函数 类变量 分配      更新时间:2023-10-16

当类变量和参数具有相同的名称时,如何在不使用this指针的情况下访问类变量以分配其值?我在构造函数中使用了class_name::variable_name,而不是指向对象的this指针。 请参阅下面的代码以更好地理解。

#include<iostream>
using namespace std;
class abc
{
int x;
public:
abc(int x)
{
abc::x=x;
}
void prnt()
{
cout<<x;
}
};
int main(void)
{
abc A(2);
A.prnt();
return 0;
}

如果不使用this指针,这怎么可能?

第 1 点:你真的没有两个x。参数为xx成员的全名是abc::x

特点2:编译器很聪明。

当他是身边唯一的约翰时,你可以称约翰史密斯为约翰,你周围的人通常可以弄清楚你指的是谁。在一个满是约翰斯的房间里,你可能需要使用他的全名。如果有多个约翰史密斯,您可能需要更进一步并使用约翰保罗史密斯。

在一个大房间里,如果其他约翰离得更远,你可以侥幸打电话给约翰保罗史密斯约翰。附近的每个人都会认为你指的是最亲近的约翰。如果他们错了,你,沟通者,必须更明确。

编译器也在做同样的事情。默认行为是使用最近的x,即可见范围最窄的那个。那将是参数x。如果要使用更远的x,请使用明确的名称。

笔记:

虽然这种情况很容易避免,并且很容易成为错误的根源,因此这是一个糟糕的决定,但您会发现需要不时更全面地限定标识符,例如,当您想要在派生类重写函数后从派生类调用基类的成员函数时。

与此相关,这是using namespace std;通常是一个坏主意的原因之一。

重命名该参数或成员和/或使用初始化列表(无论如何都应该这样做(。

abc(int x) : x(x) { }

就个人而言,我会将成员变量命名为m_x然后

abc(int x) : m_x(x) { }

首先:我会避免使用相同的名称,即使 t 是可能的。

第二:你应该初始化类的变量,而不是稍后在构造函数体内覆盖它们!如果不优化,这可能会导致对成员变量的默认构造函数进行不必要的调用。

大多数人使用编码约定来函数参数和成员变量,可能是这样的:

class abc
{
int x;
public:
abc(int x_): x{ x_ } // use initializer list and not constructor body!
{
}
};

在初始值设定项列表中,您可以对构造函数参数和成员 var 使用相同的名称。但如前所述,我个人不喜欢它!

作为评论中的提示: 您应该避免保留标识符,如以下答案中所述:在C++标识符中使用下划线的规则是什么?

实际上,您的代码在 MSVC 中编译、运行和工作(尽管我不确定它会(。但是,除了评论中提出的(更好的(建议之外,您还可以使用初始值设定项列表:

abc(int x) : x { x }
{
}

但我仍然称这种为"糟糕"的编码风格。