visual-studio - Mengenai pemusnahan pembolehubah sementara yang dijana semasa permulaan tatasusunan objek c++?
PHP中文网
PHP中文网 2017-05-16 13:24:00
0
3
1063

Situasi pertama:

Apabila mencipta tatasusunan objek C++, jika ditetapkan melalui senarai permulaan, pembolehubah sementara akan dijana, tetapi mengapa pemusnah tidak dipanggil
Kodnya adalah seperti berikut:

#include <iostream>
    using namespace std;
    class Point
    { public:
        Point():x(0),y(0)
        {   cout<<"Default Constructor called.\n";}
        Point(int xx,int yy):x(xx),y(yy)
        {   cout<< "Constructor called.\n";  }
        ~Point()
        {   cout<<"Destructor called.\n";    }
        void Move(int xx,int yy)    {  x=xx;  y=yy;   }
    private:
        int  x,y;
    };
    int main()
    {
        Point A[2]={Point(1,2),Point()};
        cout<<"hello"<<endl;
        return 0;
    }

Hasil keluarannya ialah:


Antaranya, Titik A[2]={Titik(1,2),Titik()}; memulakan tatasusunan objek A melalui dua pembolehubah sementara dua objek sementara ini.

Kes kedua:
Jika anda secara eksplisit memanggil pembina untuk setiap elemen tatasusunan, pemusnah akan dipanggil secara automatik:
Kodnya adalah seperti berikut:

#include <iostream>
using namespace std;
class B
{
    int x, y;
public:
    B();
    B(int i);
    B(int i, int j);
    ~B();
    void Print();
};
B::B() :x(0), y(0)
{
    cout << "Default constructor called.\n";
}
B::B(int i) : x(i), y(0)
{
    cout << "Constructor 1 called.\n";
}
B::B(int i, int j) : x(i), y(j)
{
    cout << "Constructor 2 called.\n";
}
B::~B()
{
    cout << "Destructor called.\n";
}
void B::Print()
{
    cout << "x=" << x << ", y=" << y << endl;
}
int  main()
{
    B *p;
    p = new B[3];
    cout << "*******" << endl;
    p[0] = B();
    p[1] = B(7);
    p[2] = B(5, 9);
    for (int i = 0; i < 3; i++)
        p[i].Print();
    cout << "*******" << endl;
    delete[]p;
}



Keputusan larian adalah seperti berikut:


Ia boleh dilihat bahawa selepas memanggil pemula pembina untuk setiap elemen tatasusunan, pembolehubah sementara dimusnahkan.


Ringkasnya, kedua-dua kes adalah pembolehubah sementara, tetapi mengapa satu akan dimusnahkan secara automatik dan satu lagi tidak akan menyelesaikannya! ! !

PHP中文网
PHP中文网

认证0级讲师

membalas semua(3)
黄舟

Saya menyemak semula maklumat dan mempraktikkannya sendiri untuk membetulkan ralat
Sebab: Tugasan objek adalah untuk menyalin nilai ahli objek di sebelah kanan ke objek di sebelah kiri, dan kemudian lepaskan objek di sebelah kanan
—————— ————
Setiap kali B() dipanggil (dengan atau tanpa parameter), objek sementara dicipta
Kes 1. Objek sementara (disimpan dalam A) tidak diberikan nilai selepasnya dicipta, jadi tiada cara untuk melepaskan objek pada Proses yang betul, objek dalam A bertahan sehingga akhir main()
Kes 2. Berikan nilai kepada tatasusunan p, cipta objek sementara dan tetapkan ia kepada Objek asal. Objek asal (iaitu, objek sementara dicipta secara automatik apabila memulakan p) hanya ditetapkan, kanan Pembolehubah sementara di sebelah dimusnahkan, dan objek sementara yang disimpan dalam p dimusnahkan apabila dipadamkan
————— —————
Mengenai mengapa pembolehubah sementara di sebelah kanan A tidak dimusnahkan, anda boleh cuba membinanya Keluarkan ini dalam fungsi, dan kemudian keluarkan rujukan kepada objek yang disimpan dalam A dan anda akan tahu. Jika terdapat sebarang kesilapan atau tidak faham, sila nyatakan dan saya akan betulkan atau menjawabnya tepat pada masanya

小葫芦

1. Jangka hayat pembolehubah aplikasi ruang tindanan dimusnahkan apabila ia melebihi skop ini dalam fungsi utama.
2. Padam tidak perlu dikatakan. Pertama sekali, B[3] juga merupakan ruang tindanan, tetapi selepas anda menetapkannya semula, misi itu telah tamat dan harus dikitar semula secepat mungkin.

大家讲道理
Point A[2]={Point(1,2),Point()};

Array A ialah pembolehubah tempatan bagi fungsi, dan memori diperuntukkan dalam kawasan tindanan Titik(1,2) dan Titik() juga pembolehubah tempatan dan juga diperuntukkan dalam kawasan tindanan. Pada masa ini, pengkompil biasanya akan membuat pengoptimuman untuk mengurangkan kitar semula dan peruntukan memori.


p = new B[3];
cout << "*******" << endl;
p[0] = B();
p[1] = B(7);
p[2] = B(5, 9);

Ruang memori tatasusunan p diperuntukkan secara dinamik dan terletak di kawasan timbunan. B(0), B(7), B(5, 9) ialah pembolehubah tempatan yang diperuntukkan pada kawasan tindanan.
Lokasi peruntukan memori kedua-dua pihak adalah berbeza, dan pengkompil tidak dapat mengoptimumkannya dan hanya boleh memusnahkannya secara jujur.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan