【问题标题】:How does copy constructor work?复制构造函数是如何工作的?
【发布时间】:2012-04-07 10:18:14
【问题描述】:

复制构造函数在 C++ 中是如何工作的

错误 1 ​​错误 C2064:术语不计算为采用 1 个参数的函数 c:\users\thuan\dropbox\homework\css 342\lab2\lab2\lab2\lab2.cpp 26

#include "intset.h"

int main() {
IntSet object1;
IntSet object2(9);  

object1(object2); //error here

   return 0;
}
//constructor
IntSet::IntSet(int a, int b, int c, int d, int e)
{
numOfArray++;
int tempArray[] = {a, b, c, d, e};
size = determineHighest(tempArray) + 1; 

arrayPtr = new bool[size]();

for (int i = 0; i < MAXINITIALSIZE; i++)
{
    if (tempArray[i] == -1)
        continue;
    arrayPtr[tempArray[i]]= true;
}   
}
//copy constructor
IntSet::IntSet(const IntSet &intsetObject)
{
numOfArray++;
size = intsetObject.size;

arrayPtr = new bool[size];

for (int i = 0; i < size; i++)
{
    if (intsetObject.arrayPtr[i])
        arrayPtr[i] = intsetObject.arrayPtr[i];
}
}

【问题讨论】:

    标签: c++ constructor copy


    【解决方案1】:

    声明后

    InSet object1;
    

    存在名为object1 的对象(通过默认构造函数创建)。复制构造函数(就像常规构造函数一样)创建一个新对象。由于对象已经存在,表达式object1(object2); 不能是复制构造函数调用。为此,您需要像这样声明变量:

    InSet object2(9);
    InSet object1(object2);
    

    如果您想将object2 复制到已经存在的object1,您将需要一个赋值运算符 (InSet&amp; InSet::operator=(const InSet&amp; other);)

    注意:编译器错误告诉你表达式(object1(object2);是一个函数调用表达式:你需要定义函数调用运算符 (void InSet::operator()(const InSet&amp; obj) ) 使其编译(返回类型可以是其他任何类型,而不仅仅是void,这取决于您的需要。)如果您定义函数调用运算符,则将您的对象转换为所谓的 functor

    编译器错误(term 不计算为带 1 个参数的函数)是正确的,但会误导 wrt。解决您的问题(但编译器无法知道您想要使用复制构造函数,而不是函数调用)

    注意:在许多编译器上,表达式

    InSet object2(9);
    InSet object1 = object2;
    

    如果可用的话,还会导致调用复制构造函数(而不是默认构造对象然后调用赋值运算符)——这是一种可能的编译器优化。

    注意:如果您拥有的唯一(常规)构造函数是您列出的那个,则声明 InSet object1;InSet object2(9); 无效,除非您在类定义中具有(常规)构造函数参数的默认值(其中声明了构造函数),你没有包括。

    【讨论】:

      【解决方案2】:

      您将对象定义为变量,然后像函数一样使用它。当对象已经构建时,您正在尝试构建它

      试试

      IntSet object2(9);
      IntSet object1(object2);
      

      【讨论】:

        【解决方案3】:

        你已经用默认构造函数构造了object1

        IntSet object1;
        

        要复制结构,您需要将其更改为

        IntSet object1( object2 );
        

        在某个时间点定义object2(您可能想要交换两个变量的名称)。

        【讨论】:

          【解决方案4】:

          它可能会帮助你理解复制构造函数

          复制构造函数用于从另一个对象声明和集成一个对象。每当我们有 demo d2-d1 之类的语句(假设 demo 是类名,d1 是演示类的已声明对象)时,它们都会调用类中定义的复制构造函数

          对于一个类演示的拷贝构造函数写成

          demo(demo & d)
           {
            //copy constructor code;
           }
          

          示例:

          #include<iostream.h>
          class demo
          {
           int data;
          public:
             demo(int x)
              {
                data=x;
              }
          
              demo(demo & d)
               {
                 data=d.data;
                  cout<<"copy constructor is called";
                }
              void show()
                {
                  cout<<"data ="<<data<<endl;
                 }
          };
          
          void main()
          { 
           demo d1(200);
           demo d2=d1;   //copy constructor is called and object passed as a reference not value 
           d2.show;
          }
          

          【讨论】:

          • 将复制构造函数的参数声明为const demo&amp; 是一个好习惯,除非您打算更改复制构造的对象
          【解决方案5】:

          由于复制构造函数的参数是一个常量对象,并且在调用它时在代码中传递的是不允许的非常量对象。

          【讨论】:

          • 反之亦然:您不能将const 对象传递给采用非const 对象的函数。
          猜你喜欢
          • 1970-01-01
          • 2018-09-23
          • 2016-03-29
          • 1970-01-01
          • 2011-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多