我查看了不同的帖子,我很难理解如何使用复制构造函数。
如果我想操纵我的课程,但我需要有原始值,我必须创建一个副本。
class object {
public:
int member[5][5];
object(object&); <-- how do we create a copy here?
void manipulate() {
<<-- how do I call it here?
}
};
我一直在尝试object copy = object(object&)
之类的不同内容,但它不起作用。
答案 0 :(得分:4)
object(object&); <-- how do we create a copy here?
一种简单的方法是省略声明,让C ++编译器为你做。由于您的对象不在其构造函数体中分配资源,因此C ++可以为您创建复制构造函数。
<<-- how do I call it here?
像这样:
object copy(*this);
... // Manipulate it here
答案 1 :(得分:1)
object( const object &obj )
{
for ( size_t i = 0; i < 5; i++ )
{
for ( int j = 0; j < 5; j++ )
{
member[i][j] = rhs.member[i][j];
}
}
}
或者你可以写简单
object( const object &obj ) = default;
因为您的复制构造函数没有做一些特别的事情。
至于它的使用,你可以用以下方式
object one;
onject two( one );
或
object one;
onject two = one;
或甚至
object one;
onject two { one };
或
object one;
onject two = { one };
还要考虑到,如果您明确定义了复制构造函数,那么您应该明确定义默认构造函数,如果需要它。
答案 2 :(得分:0)
通常会创建复制构造函数,因为您无法使用编译器生成的复制构造函数。在这种情况下,您通常会逐个复制每个成员。
例如(动态编写 - 不确定它是否会编译错误/警告)
class A
{
public:
A();
A(const A& src)
{
m_array = (char*)new char[src.m_arraySize];
memcpy(m_array, src.m_array, src.m_arraySize);
m_arraySize = src.m_arraySize;
}
private:
char* m_array;
int m_arraySize;
};