【问题标题】:How to use identical constructor parameters and field name? [duplicate]如何使用相同的构造函数参数和字段名称? [复制]
【发布时间】:2021-09-21 07:33:53
【问题描述】:

为什么这段代码显示未初始化/垃圾值?当字段名称和构造函数参数不相同时,它显示正确的值。

#include<bits/stdc++.h>
using namespace std;
class Employee {
public:
     Employee(string name,string company,int age)
     {
         name = name;
         company = company;
         age = age;
     }
     string name;
     string company;
     int age;
     void IntroduceYourself()
     {
         cout<<name<<' '<<company<<' '<<age<<endl;
     }

};
int main()
{

    Employee employee1= Employee("Saldina","Codebeauty",25);

    employee1.IntroduceYourself();

    Employee employee2 = Employee("John","Amazon",35);

    employee2.IntroduceYourself();

    return 0;
}

【问题讨论】:

  • 你认为name = name; 在做什么?编译器应该如何区分数据成员名和函数参数名?
  • 设置的变量是类变量还是局部变量是模棱两可的。如果要使用相同的字段名称,请在构造函数中使用 this 关键字,例如this->name = name;
  • 这个关键字的实际作用是什么?它是否引用类变量?@AjitVaze
  • @Roman 它指的是你正在使用的对象。

标签: c++ constructor


【解决方案1】:

如果我们在内部范围内声明一个名称,则该名称会隐藏在外部范围内声明的该名称的使用

函数参数name隐藏了数据成员name。您如何判断name 中的哪一个应该在此处的哪一侧:

name = name
// data_member = parameter ?
// parameter = data_member ?
// parameter = parameter !
// data_member = data_member ?

因此,您的输出,IntroduceYourself,打印两个空字符串和一个默认初始化的int,因为在构造函数的主体中,您将值重新分配给参数,局部变量,而数据成员是默认初始化的。

有两种常见的方法:

// Not the best practice, but can take place 
 Employee(string name,string company,int age) { 
     this->name = name;
     this->company = company;
     this->age = age;
 }

还有:

Employee(string name, string company, int age) 
    : name(name), company(company), age(age) {} // Compiler will sort it out
// Data members
string name;
string company;
int age;

请注意,您应该使用member initializer list,如第二个示例所示。否则,当您在构造函数的主体中“初始化”它们时,默认初始化数据成员,然后为它们重新分配新值。

【讨论】:

  • 感谢您的回答好友。
  • 我可以在第二种方法中使用相同的名称吗?
  • stackoverflow.com/questions/34959703/… 不过这里好像是同名。
  • Don;t you use memeber initializer list in the 2nd approach?
  • @Roman 是的,没错!检查this
猜你喜欢
  • 2010-09-21
  • 1970-01-01
  • 2021-05-31
  • 2017-03-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 2011-02-13
  • 1970-01-01
相关资源
最近更新 更多