0

复制构造函数如何在 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];
}
}
4

5 回答 5

2

声明后

InSet object1;

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

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

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

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

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

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

InSet object2(9);
InSet object1 = object2;

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

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

于 2012-04-07T10:27:32.193 回答
0

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

尝试

IntSet object2(9);
IntSet object1(object2);
于 2012-04-07T10:22:11.977 回答
0

当您这样做时,您已经object1使用默认构造函数进行了构造

IntSet object1;

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

IntSet object1( object2 );

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

于 2012-04-07T10:23:12.400 回答
0

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

复制构造函数用于声明和集成来自另一个对象的对象。每当我们有类似的语句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;
}
于 2012-04-07T10:35:33.747 回答
-1

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

于 2012-04-07T10:25:09.837 回答