Apakah benar mengatakan bahwa suatu variabel adalah turunan dari tipe data?

9

(yang dapat mengubah nilainya selama program berlangsung)

Atau apakah 'instance of something' secara ketat terkait dengan kelas dan objek? Jika demikian, bagaimana Anda mendefinisikan konsep 'variabel' ketika datang ke C ++?

Zakkor
sumber
C # dan Java berbeda dari C ++ dalam dua cara yang menarik. Pertama, mereka mencoba menyatukan tipe primitif dengan tipe objek (dan struct) (sehingga Anda dapat berbicara tentang instance int), sedangkan C ++ tidak. Kedua, dalam C # dan Java, variabel tipe objek secara implisit merujuk ke instance (kelas) di heap dan juga kita tidak berbicara tentang pointer ke objek, sedangkan di C ++, seperti jawaban @ coredump, variabel lokal tipe objek adalah binding untuk instance pada stack, dan kami secara eksplisit membedakan antara objek dan pointer ke objek.
Erik Eidt

Jawaban:

8

Sejauh yang saya tahu, adalah benar untuk memanggil nilai contoh tipe primitif dari tipe tersebut (lihat misalnya "C ++ Type System" , dari manual Visual Studio, tapi saya masih mencari sumber lain), meskipun saya percaya istilah ini banyak digunakan saat membahas objek. Objek adalah turunan dari kelas C jika dibangun dari konstruktor yang didefinisikan dalam kelas C atau salah satu dari subkelasnya.

Variabel dalam C ++ bukan konsep runtime. Itu ada di dalam kompiler Anda sebagai ikatan leksikal antara nama variabel dan lokasi abstrak (bisa berubah jika tidak const). Setelah program dikompilasi, variabel tidak ada lagi. Sebagai gantinya, data dibaca dan ditulis dalam register, memori, dll.

coredump
sumber
2
" Nilai-nilai tipe primitif umumnya tidak dikatakan sebagai contoh dari tipe itu; itu disediakan untuk objek dan kelas. " Itu tidak benar sama sekali. Tidak ada dalam standar adalah nilai tipe primitif yang tidak dianggap objek. Definisi variabel juga tidak berubah tergantung pada apakah itu kelas yang ditentukan pengguna atau tipe primitif.
Nicol Bolas
@NicolBolas Saya belum pernah mendengar orang menyebut bilangan bulat sebagai contoh dari sesuatu dalam konteks C ++, dan saya cukup yakin itu benar untuk mengatakan mereka bukan contoh dari apa pun bahkan jika standar tidak secara eksplisit menyebutkan itu. Jika tidak, apa contohnya? Saya juga tidak melihat di mana jawaban ini mengklaim bahwa definisi variabel berubah antara tipe dan objek primitif; tampaknya (afaik benar) mengklaim bahwa "instance" tidak ada hubungannya dengan definisi variabel.
Ixrec
2
@ Isrec: " Jika tidak, apa contohnya? " Jenisnya int. Standar C ++ tidak membuat perbedaan antara tipe primitif dan tipe non-primitif ketika berbicara tentang apa yang dilakukan deklarasi variabel. Jadi T t;nyatakan objek bertipe T, tidak peduli tipe apa yang Tterjadi.
Nicol Bolas
1
@Irrec: Perhatikan bahwa literal adalah hal yang berbeda. Literal adalah semacam nilai awal. Tapi Anda tidak bisa membuat variabel literal, jadi itu diskusi yang berbeda.
Nicol Bolas
5

Atau apakah 'instance of something' secara ketat terkait dengan kelas dan objek? Jika demikian, bagaimana Anda mendefinisikan konsep 'variabel' ketika datang ke C ++?

Sederhananya untuk C ++

  • Sebuah variabel adalah nama (dalam kode) untuk lokasi di memori yang akan ditentukan pada saat runtime.
  • Sebuah instance adalah objek yang berada di memori saat runtime.

Untuk memperjelas:

  • Tidak semua area memori mengandung objek. Misalnya, beberapa area memori mungkin berisi nilai 'sampah'.
  • Tidak semua objek penyimpanan memori akan diberi nama dalam kode. Objek dapat berada di area tanpa nama memori seperti posisi dalam array, atau di suatu tempat di Heap yang dirujuk oleh pointer.
  • Ketika area memori berisi sampah, biasanya karena tidak ada objek yang diinisialisasi di lokasi itu, atau karena beberapa objek yang sudah ada sebelumnya telah dihancurkan.
Ben Cottrell
sumber
1
POD adalah objek dalam C ++. Tidak semua wilayah memori adalah objek, tetapi POD bukan hanya wilayah memori.
Nicol Bolas
1
Saya yang kedua NicolBolas: POD adalah objek. Namun, Anda ada benarnya ketika Anda berbicara tentang malloc()buffer yang baru diedit, tetapi belum diinisialisasi: ini adalah area memori yang belum menjadi objek. Demikian juga, objek yang telah secara eksplisit dihancurkan: Ini adalah wilayah memori yang bukan objek lagi.
cmaster - mengembalikan monica
@NicolBolas komentar adil, saya telah mengubah kata-kata itu sedikit
Ben Cottrell
1

Nah, apa artinya "benar"?

Jika kita ingin menjadi super ketat tentang hal itu, kita perlu membedakan antara:

  • Sisi sintaksis : ekspresi memiliki tipe (statis)
  • Sisi semantik : objek adalah turunan dari kelas

Jadi, suatu variabel — menjadi ekspresi — akan memiliki tipe. Nilainya — objek yang dirujuknya — akan menjadi turunan dari beberapa kelas. Dan perhatikan bahwa tipe variabel dan kelas objek umumnya tidak sama - tipe statis variabel menempatkan batas atas pada kelas runtime objek, sehingga kelas harus berupa subtipe kelas yang sesuai dengan jenisnya.

Apakah Anda ingin mengulangi suap sebesar itu sepanjang waktu? Heck no. Seberapa ketat vs longgar kita ingin berbicara tergantung pada konteks. Jadi seringkali benar-benar tidak ada masalah dengan mengatakan bahwa "variabel adalah turunan dari tipe ini." Apa yang sebenarnya terjadi di sana adalah bahwa kita menggunakan variabel dan tipe secara metonim untuk merujuk ke objek dan superclass dari kelas runtime-nya.

sakundim
sumber
1

Kecuali jika Anda ingin menghabiskan seluruh hidup Anda dalam purisme dan sofisme ... ya.

Setiap kali Anda menyimpan sesuatu yang secara unik diidentifikasi digunakan untuk memalsukan hal-hal lain yang dapat diidentifikasi secara unik, Anda melakukan instantiasi.

  • Sebuah proyek instantiate menjadi produk
  • Sumber instantiate menjadi executable
  • Template instantiate ke dalam tipe.
  • Jenis instantiate menjadi variabel.

Beberapa instantiasi mungkin memiliki nama yang lebih akurat, tetapi secara umum ini berfungsi.

Emilio Garavaglia
sumber
0

Banyak orang memesan "instance" untuk instance kelas. Jika Anda melakukannya di C ++, variabel bisa menjadi instance dari kelas, referensi ke instance, pointer ke instance, atau tipe primitif (Anda mungkin akan menghitung struct sebagai kelas dalam konteks itu, mereka hampir sama persis). Dalam Java atau Objective-C, variabel tidak akan pernah menjadi instance tetapi mungkin referensi untuk instance.

Lupa: Untuk waktu yang singkat, penunjuk C ++ dapat menjadi penunjuk ke memori mentah, misalnya "ini" sebelum konstruktor mulai mengeksekusi. Anda mungkin belum menyebut * ini sebagai contoh pada saat ini.

gnasher729
sumber