复制C++中的构造函数,以便以后在函数中使用

Copy constructor in C++ for later use in a function

本文关键字:函数 构造函数 复制 C++      更新时间:2023-10-16

我浏览了不同的线程,很难理解如何使用复制构造函数。

如果我想操作我的类,但需要有原始值,我必须创建一个副本。

    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&),但它不起作用。

object(object&); <-- how do we create a copy here?

一个简单的方法是省略声明,并让C++编译器为您完成这项工作。由于您的对象不在其构造函数的主体中分配资源,C++可以为您处理创建复制构造函数。

<<-- how do I call it here?

像这样:

object copy(*this);
... // Manipulate it here
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 };

还要考虑的是,如果您显式定义了复制构造函数,那么如果需要,您应该显式定义默认构造函数。

由于不能使用编译器生成的副本构造函数,因此通常会创建副本构造函数。在这种情况下,您通常会逐一复制每个成员。

例如(动态编写-不确定它是否会在编译时出现错误/警告)

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