C ++基本类构造函数

时间:2018-08-26 07:38:47

标签: c++ class oop constructor

我现在正在学习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文件中,因此应该可以。

4 个答案:

答案 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->解决方案很好:)