C++

Seumur Hidup Objek dan Durasi Penyimpanan di C++

Seumur Hidup Objek dan Durasi Penyimpanan di C++
Saat membuat objek, lokasinya di memori harus ditetapkan, sebelum diinisialisasi. Inisialisasi berarti memasukkan nilai ke dalam lokasi. Masa hidup suatu objek dimulai tepat setelah inisialisasi. Ketika suatu objek mati, lokasinya (penyimpanan) yang ditempati objek dilepaskan dan kemudian komputer dimatikan atau penyimpanannya diambil (digunakan) oleh objek lain. Melepaskan sarana penyimpanan, membuat pengidentifikasi atau penunjuk yang menempati penyimpanan, menjadi tidak valid. Masa pakai suatu objek berakhir, ketika penyimpanannya dilepaskan.

Beberapa waktu diperlukan untuk membuat objek. Beberapa waktu diperlukan untuk membunuh suatu objek. Ketika berbicara tentang suatu objek, ada dua hal yang terlibat: lokasi yang merupakan penyimpanan, dan nilainya. Arti seumur hidup dan durasi penyimpanan serupa; tapi durasi lebih dilihat dari sudut pandang lokasi daripada dari sudut pandang nilai. Durasi penyimpanan adalah waktu dari saat lokasi dikaitkan dengan objek hingga saat lokasi dipisahkan dari objek.

Sisa artikel ini mengilustrasikan masa pakai objek, dan menjelaskan secara singkat durasi penyimpanan yang berbeda. Anda harus memiliki pengetahuan dasar dalam C++ untuk memahami artikel ini. Anda juga harus memiliki pengetahuan dalam lingkup C++.

Isi Artikel

Ilustrasi Seumur Hidup Objek

Perhatikan program berikut:

#termasuk
menggunakan namespace std;
int utama()

jika (1 == 1)

intx;
x = 1;
karakter y;
y = 'A';
cout << x << y << '\n';

kembali 0;

Outputnya adalah, 1A .

Kehidupan suatu objek berakhir, ketika ia keluar dari ruang lingkup. Umur benda x, dimulai dari “x = 1;” dan berakhir di akhir if-local-scope. Umur objek y, dimulai pada “y = 'A';” dan berakhir di akhir if-local-scope. Sebelum kedua objek mati, mereka digunakan dalam pernyataan cout .

Durasi Penyimpanan

Durasi penyimpanan ditentukan oleh salah satu skema berikut: durasi penyimpanan otomatis; durasi penyimpanan dinamis; durasi penyimpanan statis; durasi penyimpanan utas. Kategori durasi penyimpanan, juga berlaku untuk referensi.

Durasi Penyimpanan Otomatis

Jika suatu variabel, tidak dideklarasikan secara eksplisit sebagai static, thread_local, atau extern, maka variabel tersebut memiliki durasi penyimpanan otomatis. Contohnya adalah x dan y di atas. Durasi variabel tersebut berakhir ketika mereka keluar dari ruang lingkup. Program berikut mengilustrasikan durasi penyimpanan otomatis untuk referensi dan pointer, dalam lingkup global.

#termasuk
menggunakan namespace std;
int x = 1;
int& m = x;
char y = 'A';
karakter* n = &y;
int utama()

cout << m << *n << '\n';
kembali 0;

Outputnya adalah, 1A .

Durasi m dimulai dari “int& m = x;” dan berakhir di akhir program. Durasi n dimulai dari “char* n = &y;” dan berakhir di akhir program.

Durasi Penyimpanan Dinamis

Toko Gratis

Di komputer modern, lebih dari satu program dapat dijalankan secara bersamaan. Setiap program memiliki bagian memorinya sendiri. Sisa memori yang tidak digunakan oleh program apa pun, dikenal sebagai penyimpanan gratis. Ekspresi berikut digunakan untuk mengembalikan lokasi untuk bilangan bulat dari toko gratis

int baru

Lokasi ini (penyimpanan) untuk bilangan bulat, dikembalikan, masih harus diidentifikasi dengan penugasan ke pointer. Kode berikut mengilustrasikan cara menggunakan pointer dengan toko gratis:

int *ptrInt = int baru;
*ptrInt = 12;
cout<< *ptrInt <<'\n';

Outputnya adalah 12 .

Untuk mengakhiri masa pakai objek, gunakan ekspresi hapus sebagai berikut:

hapus ptrInt;

Argumen untuk ekspresi hapus, adalah pointer. Kode berikut mengilustrasikan penggunaannya:

int *ptrInt = int baru;
*ptrInt = 12;
hapus ptrInt;

Pointer yang dibuat dengan ekspresi baru dan dihapus dengan ekspresi hapus, memiliki durasi penyimpanan dinamis. Pointer ini mati saat keluar dari ruang lingkup, atau dihapus. Durasi objek pada kode sebelumnya, dimulai dari “*ptrInt = 12;” dan berakhir di akhir daerah deklaratif (lingkup). Ada lebih banyak ekspresi baru dan hapus daripada yang telah dibahas di sini - lihat nanti.

Durasi Penyimpanan Statis

Objek Statis

Objek yang dideklarasikan statis, berperilaku seperti objek biasa, kecuali durasi penyimpanannya, dimulai dari saat diinisialisasi hingga akhir program. Itu tidak dapat dilihat di luar ruang lingkupnya, tetapi secara tidak langsung dapat digunakan dari luar ruang lingkupnya.

Perhatikan program berikut, yang seharusnya menghitung dari 1 hingga 5 (jangan menguji program):

#termasuk
menggunakan namespace std;
int fn()

int stc = 1;
cout << " << stc;
stc = stc + 1;
jika (stc > 5)
kembali 0;
fn();

int utama()

fn();
kembali 0;

Outputnya adalah 1 1 1 1 1 1 1 1 1… dan tidak pernah benar-benar berakhir. Definisi fungsi adalah fungsi berulang; artinya itu terus memanggil dirinya sendiri sampai suatu kondisi terpenuhi.

Solusinya adalah membuat objek stc menjadi statis. Setelah objek statis telah diinisialisasi, nilainya tidak dapat diubah, sampai program berakhir. Program berikut (yang dapat Anda uji), yang sama dengan yang di atas, tetapi sekarang dengan stc dibuat statis, dihitung dari 1 hingga 5:

#termasuk
menggunakan namespace std;
int fn()

statis int stc = 1;
cout << " << stc;
stc = stc + 1;
jika (stc > 5)
kembali 0;
fn();

int utama()

fn();
kembali 0;

Outputnya adalah: 1 2 3 4 5 .

Catatan: Durasi objek statis dimulai ketika objek telah diinisialisasi, dan berakhir di akhir program. Sementara itu, objek dapat digunakan secara tidak langsung, dari ruang lingkup yang berbeda. Setelah objek statis diinisialisasi, nilai awalnya tidak dapat diubah, bahkan jika definisinya dievaluasi ulang. Dalam kode di atas, stc tidak diatur ulang, saat berikutnya dipanggil. Saat berikutnya dipanggil, itu bertambah dengan "stc = stc + 1;".

Anggota Data Statis

Seperangkat variabel dan fungsi terkait dapat dimasukkan ke dalam unit umum yang disebut kelas. Jika variabel diberi nilai tertentu, kelas menjadi objek. Namun, sebuah objek tidak dibuat hanya dengan memberikan nilai ke variabel. Kelas dipakai untuk mendapatkan objek; dan setiap objek yang dibuat memiliki namanya sendiri yang berbeda dengan objek lain dari kelas yang sama. Program berikut menunjukkan sebuah kelas, yang disebut TheCla dan sebuah objek, yang disebut obj; itu juga menunjukkan bagaimana objek dipakai dan digunakan dalam fungsi main() :

#termasuk
menggunakan namespace std;
kelas TheCla

publik:
int nomor;
void func (char cha, const char *str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

;
int utama()

Objek Kla;
obj.jumlah = 12;
obj.func('$', "500");
kembali 0;

Outputnya adalah:

Ada 12 buku senilai $500 di toko.

Perhatikan, bahwa untuk menetapkan nilai 12 ke variabel num, objek harus diinstansiasi, sebelum penugasan dapat dilakukan. Dimungkinkan bagi programmer untuk menetapkan nilai tanpa membuat instance (membuat) objek. Untuk mencapai ini, variabel, num harus dideklarasikan sebagai statis. Kemudian akan diakses sebagai "TheCla::num" tanpa nama objek, tetapi dengan nama kelas. Program berikut menggambarkan hal ini:

#termasuk
menggunakan namespace std;
kelas TheCla

publik:
static const int num = 12;
void func (char cha, const char *str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

;
int utama()

cout << TheCla::num << '\n';
Objek Kla;
obj.func('$', "500");
kembali 0;

Outputnya adalah:

12
Ada 12 buku senilai $500 di toko.

Perhatikan bahwa untuk mengakses anggota data, num di main(), operator resolusi lingkup, :: harus digunakan. Juga bukan variabel, num harus dibuat konstan dan diinisialisasi dalam deskripsi kelas (definisi).

Fungsi Anggota Statis

Perhatikan, bahwa dalam daftar program sebelumnya di atas, untuk menggunakan fungsi func di main(), sebuah objek harus diinstansiasi. Dimungkinkan bagi programmer untuk memanggil fungsi tanpa membuat instance (membuat) objek). Untuk mencapai ini, definisi fungsi harus didahului dengan kata "statis". Kemudian akan diakses sebagai "TheCla::func()" tanpa nama objek, tetapi dengan nama kelas. Program berikut mengilustrasikan ini untuk anggota data statis dan fungsi anggota statis:

#termasuk
menggunakan namespace std;
kelas TheCla

publik:
static const int num = 12;
static void func (char cha, const char *str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

;
int utama()

Kelas::func('$', "500");
kembali 0;

Outputnya adalah:

Ada 12 buku senilai $500 di toko.

Durasi Penyimpanan Utas

Thread sebagai fitur di C++, belum diimplementasikan oleh compiler g++. Jadi, alih-alih menjelaskan ini, kutipan dari spesifikasi C++ diberikan sebagai berikut:

  1. Semua variabel yang dideklarasikan dengan kata kunci thread_local memiliki durasi penyimpanan utas. Penyimpanan untuk entitas ini akan berlangsung selama utas di mana mereka dibuat. Ada objek atau referensi yang berbeda per utas, dan penggunaan nama yang dideklarasikan mengacu pada entitas yang terkait dengan utas saat ini.
  2. Variabel dengan durasi penyimpanan ulir harus diinisialisasi sebelum penggunaan pertama dan, jika dibangun, harus dihancurkan pada ulir keluar.”

Kesimpulan

Masa pakai suatu objek dimulai ketika inisialisasinya selesai, dan berakhir ketika penyimpanannya dilepaskan. Durasi penyimpanan dinamis dimulai saat penyimpanan yang dibuat oleh (Tipe baru) diinisialisasi, dan berakhir saat objek keluar dari ruang lingkup atau dihapus oleh "delete pointer". Durasi objek statis dimulai ketika objek telah diinisialisasi, dan berakhir pada akhir program. Setelah objek statis diinisialisasi, nilai awalnya tidak dapat diubah, bahkan jika definisinya dievaluasi ulang. Anggota data statis dan anggota fungsi statis diakses di luar deskripsi kelas dengan "NamaKelas::nama".

Chrys

Petakan ulang tombol mouse Anda secara berbeda untuk perangkat lunak yang berbeda dengan Kontrol Tombol X-Mouse
Mungkin Anda membutuhkan alat yang dapat membuat kontrol mouse Anda berubah dengan setiap aplikasi yang Anda gunakan. Jika demikian, Anda dapat mencob...
Ulasan Mouse Nirkabel Microsoft Sculpt Touch
Saya baru-baru ini membaca tentang Microsoft Sculpt Touch mouse nirkabel dan memutuskan untuk membelinya. Setelah menggunakannya untuk sementara waktu...
Trackpad dan Mouse Pointer di Layar AppyMouse untuk Tablet Windows
Pengguna tablet sering melewatkan penunjuk mouse, terutama ketika mereka terbiasa menggunakan laptop. Layar sentuh Smartphone dan tablet hadir dengan ...