![](/img/trans.png)
[英]How to drag a pointer inside a pointer of class objects and assign them recursively then return a pointer? C++
[英]how to access class variable inside a constructor to assign them without using this pointer in C++
当 class 变量和参数具有相同名称时,如何访问 class 变量以分配其值,而不使用this
指针? 我在构造函数中使用了class_name::variable_name
而不是指向 object 的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
指针,这怎么可能?
重命名该参数或成员和/或使用初始化列表(在任何情况下都应该这样做)。
abc(int x) : x(x) { }
我个人会命名成员变量m_x
然后做
abc(int x) : m_x(x) { }
第一:我会避免使用相同的名称,即使 t 是可能的。
第二:您应该初始化 class 的变量,以后不要在构造函数主体中覆盖它们,如果不优化的话,这可以。 导致成员变量的默认构造函数的不必要调用。
大多数人对 function 参数和成员变量使用编码约定,可能是这样的:
class abc
{
int x;
public:
abc(int x_): x{ x_ } // use initializer list and not constructor body!
{
}
};
在初始化列表中,您可以为构造函数 parm 和成员 var 使用相同的名称。 但正如所说,我个人不喜欢它!
作为评论的提示:您应该避免使用此答案中描述的保留标识符: What are the rules about using an underscore in a C++ identifier?
实际上,您的代码可以在 MSVC 中编译、运行和工作(尽管我不确定它是否会)。 但是,除了评论中提出的(更好的)建议之外,您还可以使用初始化列表:
abc(int x) : x { x }
{
}
但我仍然会称这种“糟糕”的编码风格。
第 1 点:您实际上并没有两个x
。 参数是x
。 成员x
的全名是abc::x
。
第2点:编译器很聪明。
当他是周围唯一的约翰时,你可以打电话给约翰史密斯约翰,你周围的人通常可以弄清楚你指的是谁。 在一个满是约翰的房间里,你可能需要使用他的全名。 如果有多个 John Smiths,您可能需要进一步使用 go 并使用 John Paul Smith。
在一个大房间里,如果其他约翰离得更远,你可以打电话给约翰保罗史密斯约翰。 附近的每个人都会认为您指的是最近的约翰。 如果他们错了,作为沟通者的你,就必须更加明确。
编译器也在做同样的事情。 默认行为是使用最接近的x
,即具有最窄可见 scope 的那个。 那将是参数x
。 如果要使用更远的x
,请使用明确的名称。
笔记:
虽然这种情况很容易避免并且容易产生错误,因此这是一个糟糕的决定,但您会发现您需要不时更全面地限定标识符,例如,当您想调用基础 class在派生的 class 覆盖 function 之后,派生的 class。
相关,这是using namespace std;
通常是个坏主意。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.