复制构造函数如何在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];
}
}
答案 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)
因为复制构造函数的参数是一个常量对象,并且在调用它时代码中你传递的是非常量对象,这是不允许的。