Ketika saya meneliti keunggulan C lebih dari C ++, saya menemukan paragraf ini:
Cara standar dalam C untuk melakukan enkapsulasi adalah dengan meneruskan mendeklarasikan struct dan hanya mengizinkan akses ke datanya melalui fungsi. Metode ini juga membuat enkapsulasi waktu kompilasi. Kompilasi waktu enkapsulasi memungkinkan kami untuk mengubah struktur data anggota tanpa kompilasi ulang kode klien (kode lain menggunakan antarmuka kami). Cara standar melakukan enkapsulasi C ++ di sisi lain (menggunakan kelas) membutuhkan kompilasi ulang kode klien saat menambahkan atau menghapus variabel anggota pribadi.
Saya mengerti bagaimana cara maju menyatakan struct dan mengakses anggotanya melalui fungsi menyembunyikan detail implementasi struct. Yang tidak saya mengerti adalah baris ini secara khusus:
Kompilasi waktu enkapsulasi memungkinkan kami untuk mengubah struktur data anggota tanpa kompilasi ulang kode klien (kode lain menggunakan antarmuka kami).
Dalam skenario apa ini berlaku?
struct
ini adalah kotak hitam dengan internal yang tidak diketahui. Jika klien tidak mengetahui internal, ia tidak akan pernah bisa mengaksesnya secara langsung dan Anda dapat mengubahnya sesuka hati. Ini mirip dengan enkapsulasi dalam OOP. Internal bersifat pribadi dan Anda hanya mengubah objek menggunakan metode publik.Jawaban:
Kemungkinan skenario dunia nyata di mana ini akan terjadi adalah ketika pustaka database, yang ditulis pada hari-hari ketika ruang hard disk sangat terbatas, menggunakan byte tunggal untuk menyimpan bidang 'tahun' tanggal (misalnya 11-NOV-1973 akan
73
untuk tahun ini). Tetapi, ketika Tahun 2000 datang, ini tidak lagi memadai, dan tahun itu kemudian disimpan sebagai bilangan bulat pendek (16-bit). Header yang relevan (sangat disederhanakan) untuk pustaka ini bisa berupa ini:Dan program 'klien' adalah:
Implementasi 'asli':
Kemudian, pada pendekatan Y2K, file implementasi ini akan diubah sebagai berikut (semua yang lainnya tidak tersentuh):
Ketika klien perlu diperbarui untuk menggunakan versi baru (Y2K-aman), tidak ada perubahan kode yang diperlukan. Bahkan, Anda bahkan mungkin tidak perlu mengkompilasi ulang: cukup dengan menautkan kembali ke pustaka objek yang diperbarui (jika memang seperti itu) sudah cukup.
sumber
Catatan: Daftar berikut ini tidak lengkap. Suntingan dipersilakan!
Skenario yang berlaku meliputi:
Struktur yang paling dikenal dari jenis ini adalah
FILE
. Anda cukup meneleponfopen()
dan mendapatkan pointer jika berhasil. Pointer ini kemudian diserahkan ke fungsi lain yang berfungsi pada file. Tapi Anda tidak tahu - dan Anda tidak ingin tahu - detailnya, seperti elemen dan ukuran yang terkandung.sumber