C ++

Kelayakan C ++ dan Penentu Kelas Penyimpanan

Kelayakan C ++ dan Penentu Kelas Penyimpanan

CV bermaksud Constant-Volatile. Pengisytiharan objek yang tidak didahului oleh const dan / atau volatile adalah jenis cv-tidak berkualifikasi. Sebaliknya, pengisytiharan objek yang didahului oleh const dan / atau volatile adalah jenis yang memenuhi syarat cv. Sekiranya objek dinyatakan konst, nilai di lokasinya tidak dapat diubah. Pemboleh ubah tidak menentu adalah pemboleh ubah yang nilainya berada di bawah pengaruh pengaturcara, dan oleh itu tidak dapat diubah oleh penyusun.Penentu Kelas Penyimpanan merujuk kepada kehidupan, tempat, dan cara di mana jenis itu wujud. Penentu kelas storan adalah statik, boleh berubah, thread_local, dan extern.

Artikel ini menerangkan Kelayakan C ++ dan Penentu Kelas Penyimpanan. Oleh itu, beberapa pengetahuan awal dalam C ++ sangat berguna untuk benar-benar menghargai artikel itu.

Kandungan Artikel:

Kelayakan:

penyambung

Objek yang dinyatakan sebagai pemalar adalah objek penyimpanan (lokasi) yang nilainya tidak dapat diubah. Contohnya, dalam pernyataan:

int const theInt = 5;

Nilai 5 dalam simpanan untukInt tidak boleh diubah.

tidak menentu

Pertimbangkan pernyataan berikut:

int portVal = 26904873;

Penyusun kadangkala mengganggu nilai pemboleh ubah dengan harapan dapat mengoptimumkan program. Penyusun boleh mengekalkan nilai pemboleh ubah sebagai pemalar apabila tidak seharusnya tetap. Nilai objek yang ada hubungannya dengan port IO yang dipetakan dengan memori, atau Mengganggu Rutin Servis peranti periferal, dapat diganggu oleh penyusun. Untuk mengelakkan gangguan tersebut, buat pemboleh ubah tidak stabil, seperti:

int volatile portVal;
portVal = 26904873;
atau seperti:
int volatile portVal = 26904873;

Menggabungkan const dan tidak menentu:

const dan volatile boleh berlaku dalam satu pernyataan seperti berikut:

int const volatile portVal = 26904873;

kelayakan cv

Pemboleh ubah yang didahului dengan const dan / atau volatile adalah jenis berkelayakan cv. Pemboleh ubah yang tidak didahului dengan const atau volatile atau kedua-duanya adalah jenis cv-tidak memenuhi syarat.

Memesan:

Satu jenis boleh lebih berkualiti daripada yang lain:

Itu belum dapat disimpulkan jika konstanta dan volatile berada pada peringkat yang sama.

Array dan Objek Instantiated:

Apabila array dinyatakan tetap, seperti dalam pernyataan berikut, ini bermaksud bahawa nilai setiap elemen array tidak dapat diubah:

const char arr [] = 'a', 'b', 'c', 'd';

Sama ada 'a', 'b', 'c', atau 'd', ia masih tidak dapat diubah menjadi nilai lain (watak).

Situasi yang serupa berlaku untuk objek kelas yang dibuat. Pertimbangkan program berikut:

#sertakan
menggunakan ruang nama std;
kelas Cla

awam:
char ch0 = 'a';
char ch1 = 'b';
char ch2 = 'c';
char ch3 = 'd';
;
int utama ()

const Cla obj;
pulangan 0;

Kerana pernyataan "const Cla obj;" dengan const dalam fungsi utama (), baik 'a' atau 'b' atau 'c' dan 'd' tidak dapat diubah menjadi beberapa nilai lain.

Penentu Kelas Penyimpanan:

Penentu kelas storan adalah statik, boleh berubah, thread_local, dan extern.

The Penentu Kelas Storan statik

Penentu kelas storan statik membolehkan pemboleh ubah hidup setelah skopnya dilalui, tetapi tidak dapat diakses secara langsung.

Program berikut menggambarkan ini, dengan fungsi rekursif:

#sertakan
menggunakan ruang nama std;
int funct ()

statik int stac = 10;
cout << stac < 50)

cout << '\n';
pulangan 0;

fungsi ();

int utama ()

fungsi ();
pulangan 0;

Keluarannya adalah:

10 20 30 40 50

Sekiranya pemboleh ubah statik tidak diinisialisasi pada deklarasi pertamanya, ia menganggap nilai lalai untuk jenisnya.

Penentu statik juga boleh digunakan dengan ahli kelas; penggunaan di sini berbeza. Di sini, ia membolehkan anggota diakses tanpa contoh objek.

Program berikut menggambarkan ini untuk ahli data:

#sertakan
menggunakan ruang nama std;
kelas Cla

awam:
stat stat const num = 8;
;
int utama ()

cout << Cla::num << '\n';
pulangan 0;

Keluarannya adalah:

8

Anggota data statik mesti tetap. Perhatikan bahawa penggunaan operator resolusi skop untuk mengakses pemboleh ubah statik di luar skopnya (dalam fungsi utama).

Program berikut menggambarkan penggunaan "statik" untuk fungsi anggota:

#sertakan
menggunakan ruang nama std;
kelas Cla

awam:
kaedah kekosongan statik ()

cout << "Of static member function!" << '\n';

;
int utama ()

Kaedah Cla :: ();
pulangan 0;

Keluarannya adalah:

Fungsi anggota statik!

Perhatikan bahawa penggunaan operator resolusi skop untuk mengakses fungsi anggota statik di luar skopnya (dalam fungsi utama).

Penentu yang boleh berubah

Ingat, dari atas, bahawa jika objek instantiated dimulai dengan const, nilai mana-mana anggota data normalnya tidak dapat diubah. Dan untuk mana-mana anggota data tersebut diubah, ia mesti dinyatakan, boleh berubah.

Program berikut menggambarkan ini:

#sertakan
menggunakan ruang nama std;
kelas Cla

awam:
char ch0 = 'a';
char ch1 = 'b';
char boleh ubah ch2 = 'c';
char ch3 = 'd';
;
int utama ()

const Cla obj;
obj.ch2 = 'z';
cout << obj.ch0 << " << obj.ch1 << " << obj.ch2 << " << obj.ch3 << " << '\n';
pulangan 0;

Keluarannya adalah:

'a "b" z "d'

Penentu thread_local

Dalam menjalankan program secara normal, satu segmen kod dijalankan, kemudian segmen kod berikutnya, diikuti oleh segmen kod yang lain setelah itu, dan seterusnya. Itulah satu utas; utas utamanya. Sekiranya dua segmen kod dijalankan pada masa yang sama (jangka masa yang sama), maka diperlukan utas kedua. Hasil utas kedua mungkin siap sebelum utas utamanya.

Fungsi utama () seperti utas utama. Program mungkin mempunyai lebih daripada dua utas untuk tingkah laku tidak segerak.

Benang kedua memerlukan skop (blok lingkup) untuk beroperasi. Ini biasanya disediakan oleh skop fungsi, fungsi. Pemboleh ubah dalam skop luar yang dapat dilihat dalam skop utas kedua.

Program pendek berikut menggambarkan penggunaan penentu thread_local:

#sertakan
#sertakan
menggunakan ruang nama std;
thread_local int inter = 1;
kekosongan thread_fungsi ()

inter = inter + 1;
cout << inter << "nd thread\n";

int utama ()

thread thr (& thread_fungsi); // thr mula berjalan
cout << inter << "st or main thread\n";
thr.sertai (); // utas utama menunggu utas, hingga selesai
pulangan 0;

Keluarannya adalah:

Utas pertama atau utama
Utas ke-2

Pemboleh ubah, inter, didahului oleh thread_local, bermaksud bahawa inter mempunyai contoh yang terpisah dalam setiap utas. Dan bahawa ia dapat diubah dalam benang yang berbeza untuk mempunyai nilai yang berbeza. Dalam program ini, diberikan nilai, 1 di utas utama, dan diubah menjadi nilainya, 2 di utas kedua.

Benang memerlukan objek khas untuk beroperasi. Untuk program ini, perpustakaan disertakan dengan “#include "Mempunyai kelas yang disebut utas, dari mana objek tersebut telah dibuat. Pembina untuk objek ini merujuk kepada fungsi utas sebagai argumen. Nama fungsi utas dalam program ini adalah thread_function ().

Fungsi anggota bergabung () untuk objek khas, pada kedudukannya yang digunakan, membuat utas utama menunggu utas kedua selesai dijalankan sebelum terus dilaksanakan, jika tidak, fungsi utama () boleh keluar tanpa utas (kedua) memberikan hasilnya.

Penentu luaran

Secara sederhana, untuk perisytiharan, memori tidak diperuntukkan untuk pemboleh ubah atau fungsi, sementara untuk definisi, memori dialokasikan. Kata terpelihara luaran membolehkan pemboleh ubah global atau fungsi dinyatakan dalam satu fail tetapi didefinisikan dalam fail lain. Fail sedemikian dipanggil unit terjemahan untuk aplikasi C ++ yang lengkap.

Taipkan program berikut dan simpan dengan nama fail, mainFile:

#sertakan
menggunakan ruang nama std;
int myInt;
const char ch;
batal myFn ();
int utama ()

myFn ();
pulangan 0;

Pemboleh ubah, myInt, pemboleh ubah malar, ch, dan fungsi, myFn (), telah dinyatakan tanpa ditentukan.

Ketik program berikut dengan definisi, dan simpan dengan nama fail, otherFile, dalam direktori yang sama:

#sertakan
menggunakan ruang nama std;
int myInt = 10;
const char ch = 'c';
batal myFn ()

cout << "myFn() says " << myInt << " and " << ch <<'\n';

Cobalah menyusun aplikasi di terminal (command prompt DOS) dengan perintah berikut, dan perhatikan bahawa aplikasi tersebut mungkin tidak dapat dikompilasi:

mainfile g ++.cpp lainFile.cpp -o lengkap.exe

Sekarang, mendahului tiga deklarasi di mainFile dengan kata "extern", seperti berikut:

extern int myInt;
luaran const char ch;
kekosongan luaran myFn ();

Simpan semula mainFile. Susun aplikasi dengan:

mainfile g ++.cpp lainFile.cpp -o lengkap.exe

(Ini adalah bagaimana fail yang terpisah untuk aplikasi yang sama disusun dalam C ++)

Dan ia mesti disusun. Sekarang, jalankan aplikasi, lengkapkan.exe, dan outputnya mestilah:

myFn () mengatakan 10 dan c

Perhatikan bahawa dengan penggunaan "extern", pemboleh ubah tetap dapat dinyatakan dalam satu fail tetapi didefinisikan dalam file lain. Semasa berurusan dengan deklarasi fungsi dan definisi dalam fail yang berbeza, penggunaan extern adalah pilihan.

Bila hendak menggunakan luaran? Gunakannya apabila anda tidak mempunyai fail tajuk dengan deklarasi global.

"Extern" juga digunakan dengan deklarasi templat - lihat nanti.

Kesimpulan:

Pemboleh ubah yang didahului dengan const dan / atau volatile adalah jenis berkelayakan cv. Pemboleh ubah, yang tidak didahului dengan const atau volatile atau keduanya, adalah jenis cv-qualified.

Penentu kelas storan adalah statik, boleh berubah, thread_local, dan extern. Ini mempengaruhi jangka hayat (tempoh), tempat, dan cara penggunaan pemboleh ubah dalam aplikasi.

Cara memasang dan Menggunakan Flatpak di Ubuntu 20.04
Flatpak adalah repositori perisian dan pakej seperti kedai runcit. Kedai snap itu disokong oleh Ubuntu, sementara Red Hat menyokong Flatpak. Flatpak b...
5 Alternatif Ubuntu untuk tahun 2021
Terdapat banyak pengedaran Linux, dan banyak daripadanya dirancang untuk tujuan yang berbeza. Namun, Ubuntu adalah salah satu pengedaran Linux yang pa...
Cara Memasang Ubuntu 20.04 pada Windows 10?
Windows 10 adalah sistem operasi yang meluas yang digunakan pada pelbagai platform. Namun, pengguna Linux, kebanyakan pengaturcara, dan profesional kr...