2012-04-07 64 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