复制构造函数如何工作?

时间:2012-04-07 10:18:14

标签: c++ constructor copy

复制构造函数如何在c ++中工作

错误1错误C2064:term不评估为带有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];
}
}

5 个答案:

答案 0 :(得分:2)

宣布

之后
InSet object1;

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

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

如果您要将object2复制到现有的object1,则需要分配运算符InSet& InSet::operator=(const InSet& other);

注意:编译器错误告诉您表达式(object1(object2);是函数调用表达式:您需要定义函数调用运算符({ {1}})使其编译(返回类型可以是其他任何内容,而不仅仅是void InSet::operator()(const InSet& obj),具体取决于您的需要。)如果定义函数调用操作符,则将对象转换为所谓的< EM>算符

编译器错误(术语不评估为带有1个参数的函数)是正确的,但误导了wrt。你的问题(但编译器无法知道你想使用复制构造函数,而不是函数调用)

注意:在许多编译器中使用表达式

void

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

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

答案 1 :(得分:0)

您正在将对象定义为变量,然后您将其用作函数。您正在尝试构建已构建的对象

尝试

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

答案 2 :(得分:0)

当您执行

时,您已经使用默认构造函数构建了object1
IntSet object1;

要复制consrtuct,您需要将其更改为

IntSet object1( object2 );

定义object2之后的(您可能想要交换两个变量的名称)。

答案 3 :(得分:0)

它可以帮助您理解复制构造函数

复制构造函数用于从另一个obkect声明和使用对象。只要我们有像demo d2-d1这样的语句(假设demo是类名,d1是已经声明的demo类的对象),它们就会调用类中定义的复制构造函数

类演示拷贝构造函数写为

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

答案 4 :(得分:-1)

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