我现在正在学习C ++课程,他们在过度解释所有内容方面做得很好,直到涉及到在头文件“ promises”和实现之间拆分文件。我完全是用Python学习编程的,所以我习惯于直接声明一切并根据需要导入类,因此,将承诺分开然后实现逻辑的整个过程对我来说很奇怪。
无论如何,我遇到了麻烦,因为在课程中他们说您实际上不需要使用this->
,但是当我尝试在同一.cpp文件中显式定义一个类时,我只能使用this->
时可以使用的构造函数。有人可以解释或链接讨论此问题的讨论吗?在同一文件中定义所有内容的情况下,我找不到能解释该问题的参考。
class Person {
public:
string name;
int age;
int height;
int weight;
Person (string name, int age, int height, int weight) {
name = name;
age = age;
height = height;
weight = weight;
}
};
int main () {
Person new_person("Doug", 20, 70, 170);
}
这会使我从主函数传入的所有值都未初始化。但是,如果我在构造函数的每一行中添加this->,则效果很好。我发现的示例没有使用this->
,所以我很困惑为什么在这里有必要。也许这与仍然使我感到困惑的命名空间有关(整个使用命名空间std; something),但是我认为由于它们都在同一个.cpp文件中,因此应该可以。
答案 0 :(得分:3)
参数变量 shadow 在构造函数范围内是您的成员变量。也就是说,在这种情况下,name
仅引用输入变量。
您可以做的是使用初始化列表:
Person (string name, int age, int height, int weight) :
name(name), age(age), height(height), weight(weight) {}
或使用其他名称:
Person (string _name, int _age, int _height, int _weight) {
name = _name;
age = _age;
height = _height;
weight = _weight;
}
但是您使用this->
的方法是完全可以的。
您可能还想阅读http://www.cs.technion.ac.il/users/yechiel/c++-faq/using-this-in-ctors.html
答案 1 :(得分:2)
在这种情况下,您需要this
,因为构造函数参数和类成员使用的名称相同。
Person (string name, int age, int height, int weight) {
this->name = // this-> means the member variable
name; // just the parameter
如果您的参数this
使用其他名称,则不需要
Person (string name_, int age, int height, int weight) {
name = // the member variable
name_; // the parameter
答案 2 :(得分:1)
->this
方法唯一的问题是它是A)冗长b)不初始化对象。 c)使该对象不平凡。
使用初始化列表,正确的初始化构造函数应如下所示:
Person (string nm, int ag, int ht, int wt):
name(nm), age(ag), height(ht), weight(wt) {}
这与执行操作并不完全相同,在这种情况下,可以静态创建对象而无需执行任何操作。您的类实现始终执行分配。 C ++ 11和更高版本允许完全琐碎的实现:
class Person {
public:
string name;
int age;
int height;
int weight;
void do_stuff() {};
};
// let's assume that string is std::string,
// creation from const char* and = are defined
int main()
{
Person p = { "Nemo", 35, 5, 120 };
Person p2 = p;
p = { "John-117", 24, 6, 170 };
}
答案 3 :(得分:0)
您所遇到的是从属名称含糊不清的情况。 See here:
如果当前实例成员的查找给出了不同的结果 实例化点与定义点之间的结果, 查找不明确。但是请注意,使用成员名称时, 它不会自动转换为类成员访问表达式, 仅显式成员访问表达式表示当前成员 实例化:
Eli Bendersky writes eloquently对此。摘录:
您需要做的就是使编译器了解调用f取决于模板参数T。几种方法是用 Base :: f()替换f()。 >,或使用 this-> f()(因为它隐式依赖于T)。
因此,您自己的 this->
解决方案很好:)