3

整数変数とポインター変数を持つクラスを作成しました。object を作成した後、それを関数に渡しました。関数を返した後でも、プログラムは例外をスローしていません

#include"iostream"
using namespace std;

class A
{

public :

    int i;

    char *c;

    void show();

};

void func(A obj);

int main()
{

    A a;

    a.i = 10;

    a.c = "string";

    cout << " Before Fun " << endl;

    a.show();

    cout << " Going To Call func " << endl;

    func(a);

    cout << " After func " << endl;

    a.show();

    return 0;

}


void A::show()
{
    cout << " The valuses in Object are " << i << '\t' << c  << endl;
}

void func(A aa)
{       
    cout << " The valuses in Object are " << aa.i << '\t' << aa.c  << endl;  
}

The Func では、オブジェクト a (main から) を渡し、aa (func のスタック) にコピーされます。したがって、func から戻った後、show を呼び出すと (ポインター c は a の null になります)、例外が発生しますが、発生していません。コピーコンストラクターの要件を証明するのを手伝ってください

4

6 に答える 6

7

コピー コンストラクターを非表示にします。これにより、暗黙的に呼び出されるすべての場所でコンパイル エラーが発生します。

class A
{

public :

    int i;

    char *c;
private:
    A(const A& _other);
};
于 2013-05-19T11:46:15.477 に答える
1

オブジェクトに対してコピー コンストラクターが宣言されていない場合は、暗黙的に定義されます。このコピー コンストラクターは、オブジェクトの各要素をコピーします。

あなたの例では、へのfunc(a)呼び出しはこのコピーコンストラクターを呼び出すためaa、のコピーになります(のa最初の要素を指します)。aa.i10aa.c"string"

于 2013-05-19T11:48:15.647 に答える
0

あなたの場合、コンパイラによって提供されるコピーコンストラクタが存在します。

コードを変更し、コピー コンストラクターを次のように記述します。

//Default and copy constructor

A()
{
    i = 0;
    c = NULL;
}

A(const A& _other)
{
    cout<<"In copy cons"<<endl;
}

funcが呼び出されたときに上記のようにコードを変更すると、独自のコピー コンストラクターが呼び出されます。この場合、ジャンク値が取得されます (予測できません)。 ここに画像の説明を入力

そして、コピーコンストラクターコードを次のように変更すると

A(const A& _other)
{
    cout<<"In copy cons"<<endl;

    i = _other.i;

    c = new char [(strlen(_other.c) +1)];

    strcpy(c,_other.c);

}

ここに画像の説明を入力

これで、両方の出力の違いと、Copy コンストラクターの使用方法と使用場所を確認できます。

于 2013-05-19T12:07:44.767 に答える
0

クラスを作成すると、null コンストラクターとコピー コンストラクターが暗黙的に存在します。そのため、例外はスローされません。ただし、ANY コンストラクターを定義する場合は、他のコンストラクターを定義する必要があります。そうしないと、残りのコンストラクターが上書きされます。たとえば、null コンストラクターのみを定義します。その後、例外がスローされます。暗黙的に定義されたコピー コンストラクターがオーバーライドされるためです。これは、コピー コンストラクターの必要性を証明する 1 つの方法です。

于 2013-05-19T12:12:37.047 に答える