复制构造函数或作业操作员?我想念什么

Copy constructor or assignment operator? What am I missing?

本文关键字:想念 什么 操作员 构造函数 作业 复制      更新时间:2023-10-16

我正在尝试实现复制构造函数和一个超载的分配构造函数。我有一个具有三个数据成员的员工课程。1-name 2标题3-Salary。

Employee::Employee(const Employee &emp)
{
    name = emp.name;
    title = emp.title;
    salary = emp.salary;
    cout << "nOverloaded copy constructor calledn";
}
Employee Employee::operator = (const Employee &emp) //Overloading the assignment operator.
{
    name = emp.name;
    title = emp.title;
    salary = emp.salary;
    cout << "nOverloaded assignment operator calledn";
    return emp;         //Or return *this.
}  

这是我不明白的:
1-我还没有进入"这个"指针。我的超载分配操作员是否返回 *此或EMP对象。因为在我看来,参数中的对象是分配中的右手对象。因此,我不应该用 *返回左手对象(如果那是 *这将在做什么)?
2-在主函数上,我试图致电首先致电分配运算符,然后拨打副本构造函数。因此,我期望我会看到我在那儿包含了一个cout语句,但是,这是我的输出:

称为
的重载复制构造函数超载分配运算符称为
重载的复制构造函数称为
超载复制构造函数称为

为什么会发生这种情况?

3-do我必须用const传递对象?我从中学到的书不是。

在主要我刚刚写

Employee x;
x = another;
Employee y = x;

"另一个"只是我早些时候在代码中初始初始初始化的(命名较差的)员工对象。
因此,第一个分配输出不应该
"称为"超载分配运算符"和第二个分配(这不是分配,而是根据我的理解)输出"超载复制构造函数称为"

"

通常将分配运算符实现为

Employee& Employee::operator = (const Employee &emp)
{
    name = emp.name;
    title = emp.title;
    salary = emp.salary;
    cout << "nOverloaded assignment operator calledn";
    return *this;      
}

注意返回类型的差异作为参考。您可能会发现此问题/答案很有用,为什么复制分配运算符必须返回参考/const引用?。没有看到您在main()函数中引用的代码,我们只会猜测代码中正在发生的事情。

1-我还没有进入"这个"指针。我应该超负荷 分配操作员返回 *此或EMP对象。因为似乎 对我来说,参数中的对象是右手对象 分配。所以我不应该返回左手对象 *这个(如果那是什么 *这将在做什么)?

您应该返回*this

还请注意,首先您应该检查自我分配并返回参考:

Employee& Employee::operator = (const Employee &emp) //Overloading the assignment operator.
{
    if ( this != &emp)
    {
        name = emp.name;
        title = emp.title;
        salary = emp.salary;
    }
    cout << "nOverloaded assignment operator calledn";
    return *this;
} 

在这里您可以找到如何编写分配操作员。

2-在主要功能上,我试图致电给分配 运营商首先和复制构造函数。所以我期待 我会看到我在那里包含的cout语句之后 但是其他

请从main()插入此代码,以便我们可以告诉您更多。

编辑:让我们复制构造函数为您做所有事情

Employee::Employee(const Employee &emp)
{
   if(this != &emp)
   {
       name = emp.name;
       title = emp.title;
       salary = emp.salary;
   }
  cout << "nOverloaded copy constructor calledn";
}
Employee Employee::operator = (const Employee &emp) //Overloading the assignment   .
{       
   return emp;    //Having common assignment operations similar to copy constructor
}  
  1. 超载分配运算符应返回 *此指针。您可以实现一种私人方法,该方法将复制类成员,并只能从复制构造函数/分配运算符中调用它,这将导致重复的代码较少。

    void Employee::copy(const A& rhs) throw() 
    {
      name = rhs.name;
      title = rhs.title;
      salary = rhs.salary;
    }
    Employee::Employee(const Employee& rhs)
    {
      copy(rhs);
      //  cout << "copy constructor" << endl;
    }
    Employee& operator=(const Employee& rhs)
    {
      copy(rhs);
      //  cout << "assignment operator" << endl;
      return *this;
    }
    
  2. 您的分配运算符的实现确实按值返回员工对象(应该是参考),因此临时对象是通过调用副本C-tor创建的效果。

    Overloaded copy constructor called // don't know where this printout comes from as I don't know what happens with 'another' object
    Overloaded assignment operator called // x = another; call
    Overloaded copy constructor called // the temporary object created by assignment operator's return statement (*this should be returned by reference not by value)
    Overloaded copy constructor called // Employee y = x; cal
    
  3. 当您不打算修改它们时,您应始终将输入参数传递为const。我想您会问您将员工对象作为分配运营商等中的const引用吗? - 他们应该是const参考

更多关于异常安全和分配操作员的自我分配处理的信息:GOTW 59和GOTW 23