复制构造函数或作业操作员?我想念什么
Copy constructor or assignment operator? What am I missing?
我正在尝试实现复制构造函数和一个超载的分配构造函数。我有一个具有三个数据成员的员工课程。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
}
超载分配运算符应返回 *此指针。您可以实现一种私人方法,该方法将复制类成员,并只能从复制构造函数/分配运算符中调用它,这将导致重复的代码较少。
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; }
您的分配运算符的实现确实按值返回员工对象(应该是参考),因此临时对象是通过调用副本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
当您不打算修改它们时,您应始终将输入参数传递为const。我想您会问您将员工对象作为分配运营商等中的const引用吗? - 他们应该是const参考
更多关于异常安全和分配操作员的自我分配处理的信息:GOTW 59和GOTW 23
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- c++库的公共头文件中应该包含什么
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- ifstream什么都没读
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 复制构造函数或作业操作员?我想念什么
- OpenGL中的着色器代码不正确.我想念什么