2012-04-07 74 views
0

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

错误1个错误C2064:术语不计算为服用1个参数C中的函数:\用户\顺\保管箱\作业\ CSS 342 \实验2 \实验2 \实验2 \实验2 .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]; 
} 
} 
+0

其中是类? – 2012-04-07 10:24:17

回答

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);是,如果你唯一的(普通)构造函数是您所列出的一个无效的,除非你有在类定义的(普通)构造函数的参数(如果构造函数声明的缺省值),你没有包括在内。

0

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

尝试

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

你已经有当你做

IntSet object1; 

要复制consrtuct您需要更改默认的构造函数构造object1这到

IntSet object1(object2); 

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

-1

作为复制构造函数的参数是一个常量对象,在调用它的代码中,您传递了不允许的非常量对象。

+1

它的工作原理是:你不能将'const'对象传递给一个带有非'const'对象的函数。 – Attila 2012-04-07 10:49:26

0

它可以帮助你理解拷贝构造函数

拷贝构造函数用于声明和从其他obkect intilized的对象。每当我们有说法像demo d2-d1(假设演示是类名和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; 
} 
+1

将复制构造函数的参数声明为'const demo&'是一种好习惯,除非您着墨以将您复制的对象修改为 – Attila 2012-04-07 10:43:42