Beberapa waktu diperlukan untuk membuat objek. Beberapa waktu diperlukan untuk membunuh objek. Semasa membincangkan objek, dua perkara adalah: lokasi yang merupakan simpanan, dan nilainya. Makna jangka hayat dan tempoh penyimpanan adalah serupa; tetapi jangka masa dilihat lebih dari sudut pandangan lokasi daripada sudut nilai. Tempoh penyimpanan adalah masa dari ketika lokasi dikaitkan dengan objek ke saat lokasi dipisahkan dari objek.
Selebihnya artikel ini menggambarkan jangka hayat objek, dan menerangkan secara ringkas jangka masa penyimpanan yang berbeza. Anda harus mempunyai pengetahuan asas dalam C ++ untuk memahami artikel ini. Anda juga harus mempunyai pengetahuan dalam skop C ++.
Kandungan Artikel
- Ilustrasi Sepanjang Hayat Objek
- Tempoh Penyimpanan
- Tempoh Penyimpanan Automatik
- Tempoh Penyimpanan Dinamik
- Tempoh Penyimpanan Statik
- Tempoh Penyimpanan Thread
- Kesimpulannya
Ilustrasi Sepanjang Hayat Objek
Pertimbangkan program berikut:
#sertakanmenggunakan ruang nama std;
int utama ()
jika (1 == 1)
int x;
x = 1;
char y;
y = 'A';
cout << x << y << '\n';
pulangan 0;
Keluarannya adalah, 1A .
Kehidupan objek berakhir, apabila ia berada di luar ruang lingkup. Jangka hayat objek x, bermula pada "x = 1;" dan berakhir pada akhir skop if-local. Jangka hayat objek y, bermula pada "y = 'A';" dan berakhir pada akhir skop if-local. Sebelum kedua-dua objek mati, mereka digunakan dalam pernyataan cout .
Tempoh Penyimpanan
Tempoh penyimpanan ditentukan oleh salah satu skema berikut: tempoh penyimpanan automatik; tempoh penyimpanan dinamik; tempoh penyimpanan statik; tempoh penyimpanan benang. Kategori tempoh penyimpanan, juga berlaku untuk rujukan.
Tempoh Penyimpanan Automatik
Sekiranya pemboleh ubah, tidak dinyatakan secara eksplisit sebagai statik, thread_local, atau extern, maka pemboleh ubah tersebut mempunyai tempoh penyimpanan automatik. Contohnya adalah x dan y di atas. Tempoh pemboleh ubah tersebut berakhir apabila mereka berada di luar ruang lingkup. Program berikut menggambarkan jangka masa penyimpanan automatik untuk rujukan dan penunjuk, dalam ruang lingkup global.
#sertakanmenggunakan ruang nama std;
int x = 1;
int & m = x;
char y = 'A';
char * n = & y;
int utama ()
cout << m << *n << '\n';
pulangan 0;
Keluarannya adalah, 1A .
Tempoh m bermula dari "int & m = x;" dan berakhir pada akhir program. Tempoh n bermula dari “char * n = & y;” dan berakhir pada akhir program.
Tempoh Penyimpanan Dinamik
Kedai Percuma
Dalam komputer moden, lebih daripada satu program dapat dijalankan pada masa yang sama. Setiap program mempunyai bahagian memori tersendiri. Selebihnya memori yang tidak digunakan oleh program apa pun, dikenali sebagai kedai percuma. Ungkapan berikut digunakan untuk mengembalikan lokasi bagi bilangan bulat dari kedai percuma
int baruLokasi ini (penyimpanan) untuk bilangan bulat, dikembalikan, masih harus dikenal pasti dengan memberikan penunjuk kepada penunjuk. Kod berikut menggambarkan cara menggunakan penunjuk dengan kedai percuma:
int * ptrInt = int baru;* ptrInt = 12;
cout<< *ptrInt <<'\n';
Keluarannya adalah 12 .
Untuk mengakhiri kehidupan objek, gunakan ungkapan hapus seperti berikut:
padamkan ptrInt;Argumen untuk ungkapan hapus, adalah penunjuk. Kod berikut menggambarkan penggunaannya:
int * ptrInt = int baru;* ptrInt = 12;
padamkan ptrInt;
Penunjuk yang dibuat dengan ungkapan baru dan dihapus dengan ungkapan hapus, adalah jangka masa penyimpanan dinamik. Penunjuk ini mati ketika berada di luar ruang lingkup, atau dihapuskan. Tempoh objek dalam kod sebelumnya, bermula pada “* ptrInt = 12;” dan berakhir pada akhir wilayah deklaratif (skop). Terdapat banyak lagi ungkapan baru dan hapus daripada yang telah dibincangkan di sini - lihat kemudian.
Tempoh Penyimpanan Statik
Objek Statik
Objek yang dinyatakan statik, berkelakuan seperti objek biasa, kecuali jangka masa penyimpanannya, bermula dari saat ia diinisialisasi hingga akhir program. Ia tidak dapat dilihat di luar ruang lingkupnya, tetapi secara tidak langsung dapat digunakan dari luar ruang lingkupnya.
Pertimbangkan program berikut, yang sepatutnya dihitung dari 1 hingga 5 (jangan uji program):
#sertakanmenggunakan ruang nama std;
int fn ()
int stc = 1;
cout << " << stc;
stc = stc + 1;
jika (stc> 5)
pulangan 0;
fn ();
int utama ()
fn ();
pulangan 0;
Keluarannya adalah 1 1 1 1 1 1 1 1 ... dan tidak pernah berakhir. Definisi fungsi adalah fungsi berulang; bererti ia terus memanggil dirinya sehingga syarat dipenuhi.
Penyelesaiannya ialah menjadikan objek stc itu statik. Setelah objek statik diinisialisasi, nilainya tidak dapat diubah, hingga program berakhir. Program berikut (yang boleh anda uji), yang sama seperti di atas, tetapi sekarang dengan stc yang dibuat statik, dikira dari 1 hingga 5:
#sertakanmenggunakan ruang nama std;
int fn ()
statik int stc = 1;
cout << " << stc;
stc = stc + 1;
jika (stc> 5)
pulangan 0;
fn ();
int utama ()
fn ();
pulangan 0;
Keluarannya adalah: 1 2 3 4 5 .
Catatan: Tempoh objek statik bermula apabila objek telah diinisialisasi, dan berakhir pada akhir program. Sementara itu, objek tersebut dapat digunakan secara tidak langsung, dari ruang lingkup yang berbeza. Setelah objek statik diinisialisasi, nilai awalnya tidak dapat diubah, bahkan jika definisinya dinilai semula. Dalam kod di atas, stc tidak diset semula, pada masa berikutnya dipanggil. Kali berikutnya dipanggil, ia akan ditingkatkan oleh "stc = stc + 1;".
Ahli Data Statik
Satu set pemboleh ubah dan fungsi yang berkaitan dapat dimasukkan ke dalam unit umum yang disebut kelas. Sekiranya pemboleh ubah diberi nilai tertentu, kelas menjadi objek. Walau bagaimanapun, objek tidak dibuat dengan hanya menetapkan nilai pada pemboleh ubah. Kelas dibuat untuk mendapatkan objek; dan setiap objek yang dibuat mempunyai namanya berbeza dengan objek lain dari kelas yang sama. Program berikut menunjukkan kelas, yang disebut TheCla dan objek, yang dipanggil obj; ia juga menunjukkan bagaimana objek tersebut dibuat dan digunakan dalam fungsi utama ():
#sertakanmenggunakan ruang nama std;
kelas TheCla
awam:
int int;
kekosongan kosong (char cha, const char * str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
;
int utama ()
TheCla obj;
obj.angka = 12;
obj.func ('$', "500");
pulangan 0;
Keluarannya adalah:
Terdapat 12 buku bernilai $ 500 di kedai.
Perhatikan, bahawa untuk menetapkan nilai 12 ke pemboleh ubah bilangan, objek harus dibuat, sebelum penugasan dapat dilakukan. Adalah mungkin bagi pengaturcara untuk menetapkan nilai tanpa membuat objek (membuat). Untuk mencapai ini, pembolehubah, num harus dinyatakan sebagai statik. Kemudian ia akan diakses sebagai "TheCla :: num" tanpa nama objek, tetapi dengan nama kelas. Program berikut menggambarkan ini:
#sertakanmenggunakan ruang nama std;
kelas TheCla
awam:
stat stat const num = 12;
kekosongan kosong (char cha, const char * str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
;
int utama ()
cout << TheCla::num << '\n';
TheCla obj;
obj.func ('$', "500");
pulangan 0;
Keluarannya adalah:
12
Terdapat 12 buku bernilai $ 500 di kedai.
Perhatikan bahawa untuk mengakses anggota data, angka utama (), operator resolusi skop, :: harus digunakan. Juga tidak bahawa pemboleh ubah, num harus dibuat tetap dan diinisialisasi dalam deskripsi kelas (definisi).
Fungsi Ahli Statik
Perhatikan, bahawa dalam penyenaraian program sebelumnya di atas, untuk menggunakan fungsi func di main (), objek harus dibuat. Adalah mungkin bagi pengaturcara untuk memanggil fungsi tersebut tanpa membuat (membuat) objek. Untuk mencapai ini, definisi fungsi harus didahului dengan kata "statik". Kemudian ia akan diakses sebagai "TheCla :: func ()" tanpa nama objek, tetapi dengan nama kelas. Program berikut menggambarkan ini untuk fungsi anggota data statik dan anggota statik:
#sertakanmenggunakan ruang nama std;
kelas TheCla
awam:
stat stat const num = 12;
fungsi kekosongan statik (char cha, const char * str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
;
int utama ()
TheCla :: func ('$', "500");
pulangan 0;
Keluarannya adalah:
Terdapat 12 buku bernilai $ 500 di kedai.
Tempoh Penyimpanan Thread
Thread sebagai ciri dalam C ++, belum dilaksanakan oleh penyusun g ++. Jadi, daripada menjelaskan ini, petikan dari spesifikasi C ++ diberikan seperti berikut:
- Semua pemboleh ubah yang dinyatakan dengan kata kunci thread_local mempunyai jangka masa penyimpanan utas. Penyimpanan untuk entiti-entiti ini akan bertahan sepanjang utas di mana ia dibuat. Terdapat objek atau rujukan yang berbeza bagi setiap utas, dan penggunaan nama yang dinyatakan merujuk kepada entiti yang berkaitan dengan utas semasa.
- Pemboleh ubah dengan jangka masa penyimpanan benang harus diinisialisasi sebelum penggunaan pertama odr dan, jika dibina, akan dimusnahkan semasa keluar benang."
Kesimpulannya
Jangka hayat objek bermula apabila inisialisasi selesai, dan berakhir apabila penyimpanannya dilepaskan. Tempoh penyimpanan dinamik bermula apabila penyimpanan yang dibuat oleh (Jenis baru) diinisialisasi, dan berakhir ketika objek keluar dari ruang lingkup atau dihapus dengan "hapus penunjuk". Tempoh objek statik bermula apabila objek telah diinisialisasi, dan berakhir pada akhir program. Setelah objek statik diinisialisasi, nilai awalnya tidak dapat diubah, bahkan jika definisinya dinilai semula. Anggota data statik dan anggota fungsi statik diakses di luar keterangan kelas dengan "ClassName :: name".
Chrys