Apakah daftar inisialisasi anggota menyalin string C++

jika saya menggunakan daftar inisialisasi anggota di konstruktor kelas saya yang memiliki char* di dalamnya, apakah itu menyalin nilai ke memori yang dialokasikan baru atau hanya mengarahkan penunjuk ke nilai yang sama?

ex.

MyString::MyString(const MyString & other) : m_str(other.m_str) {}

apakah ini akan baik-baik saja atau haruskah saya menjalankan sel demi sel untuk menyalin infonya?

EDIT: hanya untuk memperjelas pertanyaan saya mengubah satu baris.


person Ofek .T.    schedule 25.01.2016    source sumber
comment
Anda mungkin ingin melihat: Apa yang dimaksud dengan Aturan Tiga?   -  person NathanOliver    schedule 25.01.2016
comment
Disebut daftar inisialisasi karena merupakan daftar inisialisasi. Itu akan melakukan hal serupa dengan char *m_str = other.m_str;   -  person M.M    schedule 25.01.2016
comment
Harap berikan setidaknya definisi kerangka yang relevan dengan kelas Anda.   -  person Kerrek SB    schedule 25.01.2016
comment
Ketika Anda mengatakan apakah itu menyalin nilai, a) apakah itu merujuk ke konstruktor (jika ya, tolong katakan demikian dan jangan mainkan permainan kata ganti), dan b) apakah menyalin nilai berarti menyalin string yang ditunjuk oleh penunjuk untuk, daripada menyalin nilai pointer?   -  person Kerrek SB    schedule 25.01.2016
comment
apakah ini akan baik-baik saja atau haruskah saya menjalankan sel demi sel untuk menyalin infonya? membuatnya cukup jelas, menurut saya.   -  person Lightness Races in Orbit    schedule 25.01.2016
comment
Tolong jelaskan apa artinya akan baik-baik saja. Silakan tunjukkan destruktor kelas Anda jika Anda sudah mendefinisikannya.   -  person Kerrek SB    schedule 25.01.2016
comment
Saya sudah mendapat jawabannya jadi lupakan saja. Saya tidak perlu menunjukkan destruktornya kepada siapa pun karena ini pertanyaan umum, saya hanya memasukkan kode untuk contoh panggilan IL. Saya bertanya-tanya apakah itu akan menduplikasi pointer yang menunjuk ke char[] atau akankah itu benar-benar menyalin char[] dan membuat pointer untuk itu, saya sudah berasumsi itu tidak akan menyalinnya secara mendalam tetapi meminta untuk amannya. Jadi, saya mendapatkan jawaban saya karena di IL ia hanya menyalin apa yang didapatnya - seolah-olah itu adalah sebuah penunjuk, ia hanya akan menyalin penunjuk itu sendiri. Terima kasih. Apakah saya sudah jelas sekarang dan tidak perlu pertanyaan lebih lanjut?   -  person Ofek .T.    schedule 26.01.2016


Jawaban (3)


Saya hanya menyalin penunjuknya, sehingga keduanya akan menunjuk ke string yang sama.

Ini mungkin akan menyebabkan masalah bagi Anda jika nanti Anda ingin menghapus string yang ditunjuk.

person Bo Persson    schedule 25.01.2016
comment
Terima kasih, saya hanya ingin tahu apakah itu menyalin ptr atau nilainya ke ruang baru. - person Ofek .T.; 25.01.2016
comment
@ Ofek.T.: Tentu saja, Anda dapat menentukannya sendiri hanya dengan mencetak kedua pointer sebagai void* dan membandingkan. - person Lightness Races in Orbit; 25.01.2016

Ia melakukan keduanya:

  • Itu menyalin penunjuk.

  • Salinan penunjuk menunjuk ke hal yang sama dengan aslinya.

person Kerrek SB    schedule 25.01.2016
comment
Ini bukan keduanya dalam arti yang dijelaskan OP. - person Lightness Races in Orbit; 25.01.2016
comment
@LightnessRacesinOrbit: Hmm... mungkin dengan banyak goyangan interpretatif... tapi seperti yang tertulis, kata OP, kelas saya memiliki pointer char di dalamnya; apakah konstruktor salinan menyalin nilainya, dan memang demikian. - person Kerrek SB; 25.01.2016
comment
Sejujurnya, menurut saya tidak mengabaikan lima kata berikutnya dianggap sebagai banyak goyangan interpretatif. apakah itu menyalin nilai ke memori yang dialokasikan baru cukup jelas bahwa OP berarti salinan dalam di sini. - person Lightness Races in Orbit; 25.01.2016
comment
@LightnessRacesinOrbit: Pointer sedang disalin ke memori yang baru dialokasikan, yaitu memori yang dialokasikan untuk instance MyString baru. Saya memikirkan dengan hati-hati apakah penghilangan tersebut akan mempengaruhi maknanya dan memutuskan bahwa hal itu tidak akan terjadi. - person Kerrek SB; 25.01.2016
comment
Sebenarnya? Tidak, itu tidak akan terjadi. Namun kita tidak membicarakan tentang apa itu; kita berbicara tentang apa yang dimaksud OP dengan pertanyaan tersebut, dan saya menerapkan heuristik yang cermat untuk menentukan bahwa kemungkinan besar OP menanyakan tentang salinan dalam vs dangkal, daripada OP menanyakan tentang salinan dangkal vs dangkal (??? ). - person Lightness Races in Orbit; 25.01.2016
comment
@LightnessRacesinOrbit: Saya mengerti semua itu. Masalahnya adalah OP sangat membingungkan tentang arti dari hampir setiap kata dalam pertanyaan. Saya pikir akan lebih baik untuk memperbaiki pertanyaannya terlebih dahulu, dan kemudian menjawab pertanyaan yang jelas. - person Kerrek SB; 25.01.2016
comment
Saya juga! Anda akan melihat bahwa, tidak seperti Anda, saya belum menjawabnya ;) xxx - person Lightness Races in Orbit; 25.01.2016
comment
@LightnessRacesinOrbit: Dicatat :-) Dan memulai serangkaian komentar yang meminta pertanyaan tersebut diperbaiki. - person Kerrek SB; 25.01.2016
comment
Saya berharap Anda berhasil dalam pencarian Anda! - person Lightness Races in Orbit; 25.01.2016

Variabel penunjuk (dalam cara pandang yang sangat sederhana) pada dasarnya tidak lebih dari variabel bilangan bulat yang ditangani secara khusus oleh kompiler. Isi dari variabel penunjuk (yang diinisialisasi) adalah alamat yang ditunjuknya dalam memori.

Jika Anda menginisialisasi satu variabel penunjuk ke konten variabel penunjuk lain, Anda menyalin konten tersebut, sehingga menghasilkan dua variabel berbeda yang keduanya memiliki konten yang sama dan keduanya menunjuk ke memori yang sama.

person Some programmer dude    schedule 25.01.2016
comment
Kecewa melihat orang pintar seperti Anda menyebarkan petunjuk ini adalah omong kosong! - person Lightness Races in Orbit; 25.01.2016
comment
@Lightness Races in Orbit Bisakah Anda menambahkan tautan atau penjelasan mengapa pointer tidak boleh dianggap sebagai pemegang alamat - person Ziezi; 25.01.2016
comment
@simplicisveritatis sintaks ping tidak memiliki spasi di dalamnya (misalnya lihat apa yang saya lakukan dalam pesan ini). Jika Anda mulai mengetikkan nama dan menekan Tab, itu akan dilengkapi secara otomatis ke sintaks yang benar. Saya curiga LRiO yang dimaksudkan untuk merujuk pada petunjuk adalah bilangan bulat yang tidak masuk akal... kalau tidak, saya tidak tahu apa yang dia bicarakan - person M.M; 25.01.2016