繁体   English   中英

C ++基本类构造函数

[英]C++ Basic Class Constructor

我现在正在上一门C ++课程,他们在过度解释所有内容方面做得很好,直到涉及到在头文件“承诺”和实现之间拆分文件。 我完全是用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; thing),但是我认为由于它们都在同一个.cpp文件中,因此应该可以使用。

参数变量使构造函数范围内的成员变量黯然失色 也就是说,在这种情况下, 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

在这种情况下,你需要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

->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 };
}

您所拥有的只是一个依赖名称含混不清的情况。 看这里

如果当前实例化成员的查找在实例化点与定义点之间给出了不同的结果,则该查找不明确。 但是请注意,使用成员名称时,不会自动将其转换为类成员访问表达式,只有显式成员访问表达式指示当前实例的成员:

埃利·本德斯基(Eli Bendersky)雄辩地对此作了论述。 摘录:

您要做的就是让编译器了解调用f取决于模板参数T。几种方法是用Base :: f()this-> f()替换f()。 (因为这隐含地依赖于T)。

因此,您自己的this->解决方案还不错this->

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM