繁体   English   中英

如何在构造函数中访问 class 变量以在不使用 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM