在 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
。好的,让我们继续。 Base
和 Derived
都是模板...
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成员
我阅读的与我的问题相关并回答了部分问题的帖子:
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
。好的,让我们继续。 Base
和 Derived
都是模板...
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成员