Pertanyaan Apa perbedaan antara operator penugasan dan penyalin penyalin?


Saya tidak mengerti perbedaan antara konstruktor tugas dan menyalin konstruktor di C ++. Seperti ini:

class A {
public:
    A() {
        cout << "A::A()" << endl;
    }
};

// The copy constructor
A a = b;

// The assignment constructor
A c;
c = a;

// Is it right?

Saya ingin tahu bagaimana mengalokasikan memori konstruktor tugas dan menyalin konstruktor?


76
2017-07-29 01:56


asal


Jawaban:


SEBUAH salin konstruktor digunakan untuk menginisialisasi sebelumnya tidak terinisialisasi objek dari beberapa data objek lain.

A(const A& rhs) : data_(rhs.data_) {}

Sebuah operator penugasan digunakan untuk menggantikan data a diinisialisasi sebelumnya objek dengan beberapa data objek lain.

A& operator=(const A& rhs) {data_ = rhs.data_; return *this;}

Anda dapat mengganti konstruksi salinan dengan konstruksi default plus tugas, tetapi itu akan kurang efisien.

(Sebagai catatan: Implementasi saya di atas adalah yang kompiler memberi Anda secara gratis, jadi tidak akan masuk akal untuk menerapkannya secara manual. Jika Anda memiliki salah satu dari keduanya, kemungkinan Anda secara manual mengelola beberapa sumber daya. Dalam hal ini, per Aturan Tiga, Anda kemungkinan besar juga membutuhkan yang lain plus perusak.)


110
2017-07-29 02:07



Perbedaan antara konstruktor salin dan operator penugasan menyebabkan banyak kebingungan bagi pemrogram baru, tetapi sebenarnya tidak terlalu sulit. Meringkas:

  • Jika objek baru harus dibuat sebelum penyalinan dapat terjadi, konstruktor penyalinan digunakan.
  • Jika objek baru tidak harus dibuat sebelum penyalinan dapat terjadi, operator penugasan digunakan.

Contoh untuk operator penugasan:

Base obj1(5); //calls Base class constructor
Base obj2; //calls Base class default constructor
obj2 = obj1; //calls assignment operator

Contoh untuk konstruktor salin:

Base obj1(5);
Base obj2 = obj1; //calls copy constructor

24
2017-07-23 12:13



Yang pertama adalah copy inisialisasi, yang kedua hanyalah penugasan. Tidak ada yang namanya konstruktor tugas.

A aa=bb;

menggunakan konstruktor salin kompilator yang dihasilkan.

A cc;
cc=aa;

menggunakan konstruktor default untuk membangun cc, dan kemudian * operator penugasan ** (operator =) pada objek yang sudah ada.

Saya ingin tahu bagaimana mengalokasikan memori konstruktor tugas dan menyalin konstruktor?

IDK apa yang Anda maksud dengan mengalokasikan memori dalam kasus ini, tetapi jika Anda ingin melihat apa yang terjadi, Anda dapat:

class A
{
public :
    A(){ cout<<"default constructor"<<endl;};
    A(const A& other){ cout<<"copy constructor"<<endl;};
    A& operator = (const A& other){cout <<"assignment operator"<<endl;}
};

Saya juga menyarankan Anda untuk melihat:

Mengapa konstruktor salin disebut sebagai pengganti konstruktor konversi?

Apa itu Aturan Tiga?


18
2017-07-29 02:00



perbedaan antara konstruktor salin dan konstruktor tugas adalah:

  1. Dalam hal konstruktor salin, ini menciptakan objek baru. (<classname> <o1>=<o2>)
  2. Dalam kasus konstruktor tugas itu tidak akan membuat objek apa pun berarti itu berlaku pada objek yang sudah dibuat (<o1>=<o2>).

Dan fungsi dasar keduanya sama, mereka akan menyalin data dari o2 ke o1 anggota-oleh-anggota.


2
2018-01-01 12:35



Apa @Luchian Grigore Said diimplementasikan seperti ini

class A
{
public :
    int a;
    A(){ cout<<"default constructor"<<endl;};
    A(const A& other){ cout<<"copy constructor"<<endl;};
    A& operator = (const A& other){cout <<"assignment operator"<<endl;}
};

void main()
{
    A sampleObj; //Calls default constructor
    sampleObj.a = 10;

    A copyConsObj  = sampleObj; //Initializing calls copy constructor

    A assignOpObj; //Calls default constrcutor
    assignOpObj = sampleObj; //Object Created before so it calls assignment operator
}

KELUARAN


konstruktor default


salin konstruktor


konstruktor default


operator penugasan



1
2018-03-03 07:04



Sesuatu untuk ditambahkan tentang konstruktor salin:

  • Saat mengirimkan objek berdasarkan nilai, itu akan menggunakan konstruktor salin

  • Ketika suatu objek dikembalikan dari fungsi berdasarkan nilai, ia akan menggunakan konstruktor salin

  • Ketika menginisialisasi objek menggunakan nilai-nilai objek lain (seperti contoh yang Anda berikan).


1
2018-01-24 11:28



Dengan kata sederhana,

Salin konstruktor disebut ketika objek baru dibuat dari objek yang ada, sebagai salinan dari objek yang ada. Dan operator penugasan dipanggil ketika objek yang sudah diinisialisasi diberikan nilai baru dari objek lain yang sudah ada.

Contoh-

t2 = t1;  // calls assignment operator, same as "t2.operator=(t1);"
Test t3 = t1;  // calls copy constructor, same as "Test t3(t1);"

1
2018-02-19 20:35



Saya ingin menambahkan satu poin lagi tentang topik ini. "Fungsi operator operator penugasan harus ditulis hanya sebagai fungsi anggota kelas." Kita tidak bisa menjadikannya sebagai fungsi teman tidak seperti operator biner atau unary lainnya.


1
2017-08-18 18:09