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つの引数を取る関数に評価されません)は正しいですが、誤解を招く可能性があります。問題に対して(ただし、関数呼び出しの代わりにコピーコンストラクターを使用したいことをコンパイラーが知る方法はありません)

注:多くのコンパイラーでは、式

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;

consrtuctをコピーするには、これを次のように変更する必要があります

IntSet object1( object2 );

定義のある時点でobject2(おそらく2つの変数の名前を入れ替えたいと思うでしょう)。

于 2012-04-07T10:23:12.400 に答える
0

コピーコンストラクターを理解するのに役立つかもしれません

コピー コンストラクターは、別のオブジェクトからオブジェクトを宣言して intilized するために使用されます。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;
}
于 2012-04-07T10:35:33.747 に答える
-1

コピーコンストラクターの引数は定数オブジェクトであり、コードではそれを呼び出すときに、許可されていない非定数オブジェクトを渡します。

于 2012-04-07T10:25:09.837 に答える