如何在构造函数中访问类变量以分配它们,而无需在C++中使用此指针
how to access class variable inside a constructor to assign them without using this pointer in C++
当类变量和参数具有相同的名称时,如何在不使用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
。参数为x
。x
成员的全名是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 }
{
}
但我仍然称这种为"糟糕"的编码风格。
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错