Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 何时使用;这";成员函数中的指针_C++_This - Fatal编程技术网

C++ 何时使用;这";成员函数中的指针

C++ 何时使用;这";成员函数中的指针,c++,this,C++,This,背景: 我正在阅读别人编写的代码,对于C++编程来说,我是相当新的。当我查看此人编写的类和相应的成员函数时,我会对这个指针的用法感到困惑。在某些成员函数中使用此,在其他函数中不使用 为什么会这样 我知道对于最近开始做C++的人来说,这是一个非常普遍的混乱。 代码片段: 班级: 成员函数(不含此): 问题: 请注意,在void InitTable::clearTable()中,使用了this->table.clear(),在void InitTable::deleteEntry()中,使用了ta

背景:

我正在阅读别人编写的代码,对于C++编程来说,我是相当新的。当我查看此人编写的类和相应的成员函数时,我会对
这个
指针的用法感到困惑。在某些成员函数
中使用此
,在其他函数中不使用

为什么会这样

我知道对于最近开始做C++的人来说,这是一个非常普遍的混乱。 代码片段:

班级:

成员函数(不含此
):


问题:

请注意,在
void InitTable::clearTable()
中,使用了
this->table.clear()
,在
void InitTable::deleteEntry()
中,使用了
table.erase()
table
而不使用
this

void InitTable::clearTable()
{
    table.clear();    // no "this"
}
这里有什么把戏?如果改为使用
this->table.erase()
,会出现什么行为

void InitTable::deleteEntry(std::string sumoID)
{
    InitEntry* ie = getEntry(sumoID);
    if (ie != NULL)
    {
        this->table.erase(sumoID);   // "this" added
        delete ie;
    }
}

正如我所说,我有点n00b,因此用最少的示例进行全面的描述将非常有用。

在正常函数中不需要它,除非存在与成员同名的参数。在构造函数中,可以使用初始化器列表来防止歧义。使用模板时,可能需要使用
指针。

使用
的最常见原因是传递到需要“指向此对象的指针”的其他函数。相反,JavaScript坚持要求这样做。如果这个类是模板类呢?您可以使用
this->x
使表达式依赖于模板类型。never required不太正确。例如,当您引用基类模板的成员时,它是必需的。“…除非构造函数的成员初始值设定项列表中存在与成员同名的参数,”(参数)名称可以明确使用。对于Praetorian和rodrigos评论的扩展,我发现了这一点,除非使用
this
解决名称冲突(如果成员被函数参数遮挡),这主要是一个品味问题。就我个人而言,我总是
-符合会员访问资格。可能有很好的理由去做相反的事情,但坚持使用一种风格几乎肯定是一个好主意。因此,基本上在这种情况下,两种方式都可以,有
这个
,没有它?是的,这里不需要
这个
,除了个人喜好,可能。
如果您返回调用对象的引用,也可以使用此
void InitTable::deleteEntry(std::string sumoID)
{
    InitEntry* ie = getEntry(sumoID);
    if (ie != NULL)
    {
        table.erase(sumoID);
        delete ie;
    }
}
void InitTable::clearTable()
{
    table.clear();    // no "this"
}
void InitTable::deleteEntry(std::string sumoID)
{
    InitEntry* ie = getEntry(sumoID);
    if (ie != NULL)
    {
        this->table.erase(sumoID);   // "this" added
        delete ie;
    }
}