在 class 的构造函数中使用 'this' 关键字与在 C++ 中不使用它有区别吗

Is there a difference between using 'this' keyword in the constructor of a class or not using it in C++

我阅读的与我的问题相关并回答了部分问题的帖子:

Using 'this' keyword in constructor

Difference between using keyword new in constructor and in data portion of a class

我的问题:

我的具体问题来自此处的主题:

Using 'this' keyword in constructor

该主题中关于歧义的答案是否与 C++ 相同?如果我的参数与我的字段同名,我使用 this 是否重要?

这是一个带有 this 关键字的示例:

    Gui::Gui()
    {
        this->organismSize = 10.0;
        this->foodSize = 5.0;
    }

没有 this 关键字:

    Gui::Gui()
    {
        organismSize = 10.0;
        foodSize  5.0;
    }

无需在构造函数中使用 'this' 关键字,除非 class 属性和参数具有相同的名称。

Gui::Gui(const double organismSize, const double foodSize )
{
    organismSize =organismSize; // we have an ambiguity, the compiler cannot make a difference between the parameter and the attribute
    foodSize = foodSize ;
}

Gui::Gui(const double organismSize, const double foodSize )
{
    this->organismSize =organismSize; // the compiler can make a difference between the parameter and the attribute
    //this->organismSize is the attribute while organismSize is the parameter
    this->foodSize = foodSize ;
}

之前(接受的)答案不正确!

使用 this 访问 class 的成员的主要原因是当此 class 是模板时,基础 class 取决于模板范围。考虑这段代码:

struct Base {
    Base ()
      : m_baseMember(42) {}
    int m_baseMember;
};

int m_baseMember;

struct Derived : public Base {
    Derived() {
        m_baseMember = 0;
        m_derivedMember = 0;
    }

    int m_derivedMember;
};

int main() {
    Derived d;
    cout << d.m_baseMember << ' ' << d.m_derivedMember << endl;
    return 0;
}

此代码显然输出 0 0,因为赋值 m_baseMember = 0; 影响 Base class.

的成员

现在是一个非常相似的代码,但是基础 class 变成了一个模板,我用 int:

实例化了它
template<typename T>
struct Base {
    Base ()
      : m_baseMember(42) {}
    int m_baseMember;
};

int m_baseMember;

struct Derived : public Base<int> {
    Derived() {
        m_baseMember = 0;
        m_derivedMember = 0;
    }

    int m_derivedMember;
};

int main() {
    Derived d;
    cout << d.m_baseMember << ' ' << d.m_derivedMember << endl;
    return 0;
}

再次输出 0 0。好的,让我们继续。 BaseDerived 都是模板...

template<typename T>
struct Base {
    Base ()
      : m_baseMember(42) {}
    int m_baseMember;
};

int m_baseMember;

template<typename T>
struct Derived : public Base<int> {
    Derived() {
        m_baseMember = 0;
        m_derivedMember = 0;
    }

    int m_derivedMember;
};

int main() {
    Derived<int> d;
    cout << d.m_baseMember << ' ' << d.m_derivedMember << endl;
    return 0;
}

输出又是0 0。这段代码不会出错!再尝试一次:现在 Derived 继承自 Base<T>(而不是 Base<int>):

template<typename T>
struct Base {
    Base ()
      : m_baseMember(42) {}
    int m_baseMember;
};

int m_baseMember;

template<typename T>
struct Derived : public Base<T> {
    Derived() {
        m_baseMember = 0;
        m_derivedMember = 0;
    }

    int m_derivedMember;
};

int main() {
    Derived<int> d;
    cout << d.m_baseMember << ' ' << d.m_derivedMember << endl;
    return 0;
}

输出是...42 0.

那是因为在这段非常非常非常相似的代码中,赋值 m_baseMember = 0; 被应用于全局变量。我们明确使用 this:

的最终片段
template<typename T>
struct Base {
    Base ()
      : m_baseMember(42) {}
    int m_baseMember;
};

int m_baseMember;

template<typename T>
struct Derived : public Base<T> {
    Derived() {
        this->m_baseMember = 0;
        m_derivedMember = 0;
    }

    int m_derivedMember;
};

int main() {
    Derived<int> d;
    cout << d.m_baseMember << ' ' << d.m_derivedMember << endl;
    return 0;
}

输出又是0 0,因为this->m_baseMember = 0;明显影响了class成员