C ++

Jangka Hayat dan Penyimpanan Objek dalam C ++

Jangka Hayat dan Penyimpanan Objek dalam C ++
Semasa membuat objek, lokasinya di memori harus ditentukan, sebelum diinisialisasi. Inisialisasi bermaksud meletakkan nilai ke lokasi. Jangka hayat objek bermula selepas inisialisasi. Apabila objek mati, lokasinya (penyimpanan), tempat objek yang diduduki dilepaskan dan kemudian komputer dimatikan atau penyimpanannya diambil (digunakan) oleh objek lain. Melepaskan alat penyimpanan, menjadikan pengecam atau penunjuk yang menempati simpanan tidak sah. Jangka hayat objek berakhir, apabila simpanannya dilepaskan.

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

Pertimbangkan program berikut:

#sertakan
menggunakan 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.

#sertakan
menggunakan 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 baru

Lokasi 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):

#sertakan
menggunakan 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:

#sertakan
menggunakan 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 ():

#sertakan
menggunakan 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:

#sertakan
menggunakan 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:

#sertakan
menggunakan 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:

  1. 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.
  2. 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

Buat semula butang tetikus anda secara berbeza untuk perisian yang berbeza dengan X-Mouse Button Control
Mungkin anda memerlukan alat yang dapat mengubah kawalan tetikus anda dengan setiap aplikasi yang anda gunakan. Sekiranya ini berlaku, anda boleh menc...
Kajian Tetikus Tanpa Wayar Microsoft Sculpt Touch
Saya baru-baru ini membaca mengenai Sentuhan Microsoft Sculpt tetikus tanpa wayar dan memutuskan untuk membelinya. Setelah menggunakannya sebentar, sa...
Trackpad dan Mouse Pointer pada skrin Windows AppyMouse untuk Tablet Windows
Pengguna tablet sering kehilangan penunjuk tetikus, terutama ketika mereka biasa menggunakan komputer riba. Telefon pintar dan tablet skrin sentuh dil...