C++

Kualifikasi C++ dan Penentu Kelas Penyimpanan

Kualifikasi C++ dan Penentu Kelas Penyimpanan

CV adalah singkatan dari Constant-Volatile. Deklarasi sebuah objek yang tidak didahului oleh const dan/atau volatile adalah tipe cv-unqualified. Di sisi lain, deklarasi objek yang didahului oleh const dan/atau volatile adalah tipe yang memenuhi syarat cv. Jika suatu objek dideklarasikan const, nilai di lokasinya tidak dapat diubah. Variabel volatil adalah variabel yang nilainya berada di bawah pengaruh programmer, dan karenanya tidak dapat diubah oleh compiler.Storage Class Specifier mengacu pada kehidupan, tempat, dan cara di mana suatu tipe ada. Penentu kelas penyimpanan bersifat statis, dapat diubah, thread_local, dan eksternal.

Artikel ini menjelaskan Kualifikasi C++ dan Penentu Kelas Penyimpanan. Jadi, beberapa pengetahuan awal dalam C++ berguna untuk benar-benar menghargai artikel.

Isi Artikel:

Kualifikasi:

konstan

Objek yang dideklarasikan konstan adalah objek penyimpanan (lokasi) yang nilainya tidak dapat diubah. Misalnya dalam pernyataan:

int consttheInt = 5;

Nilai 5 dalam penyimpanan untuk theInt tidak dapat diubah.

lincah

Perhatikan pernyataan berikut:

int portVal = 26904873;

Kompiler terkadang mengganggu nilai variabel dengan harapan mengoptimalkan program. Kompiler dapat mempertahankan nilai variabel sebagai konstan ketika tidak seharusnya konstan. Nilai objek yang berkaitan dengan port IO yang dipetakan memori, atau Rutinitas Layanan Interupsi perangkat periferal, dapat diganggu oleh kompiler. Untuk mencegah interferensi tersebut, buat variabel volatile, seperti:

int portVal yang mudah menguap;
portVal = 26904873;
atau seperti:
int volatil portVal = 26904873;

Menggabungkan const dan volatile:

const dan volatile dapat terjadi dalam satu pernyataan sebagai berikut:

int const volatile portVal = 26904873;

kualifikasi cv

Variabel yang didahului dengan const dan/atau volatile adalah tipe yang memenuhi syarat cv. Variabel yang tidak didahului dengan const atau volatile atau keduanya adalah tipe cv-unqualified.

Memerintah:

Satu jenis dapat lebih memenuhi syarat cv daripada yang lain:

Belum disimpulkan jika const dan volatile memiliki peringkat yang sama.

Array dan Objek Instansiasi:

Ketika sebuah array dideklarasikan konstan, seperti pada pernyataan berikut, berarti nilai setiap elemen array tidak dapat diubah:

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

Apakah itu 'a', 'b', 'c', atau 'd', itu masih tidak dapat diubah ke beberapa nilai (karakter) lain.

Situasi serupa berlaku untuk objek instantiated dari kelas. Perhatikan program berikut:

#termasuk
menggunakan namespace std;
kelas Cla

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

const Cla obj;
kembali 0;

Karena pernyataan “const Cla obj;” dengan const dalam fungsi main(), baik 'a' atau 'b' atau 'c' atau 'd' tidak dapat diubah ke nilai lain.

Penentu Kelas Penyimpanan:

Penentu kelas penyimpanan adalah statis, dapat diubah, thread_local, dan eksternal.

Itu Penentu Kelas Penyimpanan statis

Penentu kelas penyimpanan statis memungkinkan variabel untuk hidup setelah cakupannya selesai, tetapi tidak dapat diakses secara langsung.

Program berikut mengilustrasikan hal ini, dengan fungsi rekursif:

#termasuk
menggunakan namespace std;
fungsi int()

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

cout << '\n';
kembali 0;

fungsi();

int utama()

fungsi();
kembali 0;

Outputnya adalah:

10 20 30 40 50

Jika variabel statis tidak diinisialisasi pada deklarasi pertamanya, ia mengasumsikan nilai default untuk tipenya.

Penentu statis juga dapat digunakan dengan anggota kelas; penggunaan di sini berbeda. Di sini, memungkinkan anggota untuk diakses tanpa instantiasi untuk objek.

Program berikut mengilustrasikan ini untuk anggota data:

#termasuk
menggunakan namespace std;
kelas Cla

publik:
static const int num = 8;
;
int utama()

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

Outputnya adalah:

8

Anggota data statis harus konstan. Perhatikan bahwa penggunaan operator resolusi ruang lingkup untuk mengakses variabel statis di luar ruang lingkupnya (dalam fungsi utama).

Program berikut mengilustrasikan penggunaan "statis" untuk fungsi anggota:

#termasuk
menggunakan namespace std;
kelas Cla

publik:
metode kekosongan statis ()

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

;
int utama()

Kla::metode();
kembali 0;

Outputnya adalah:

Dari fungsi anggota statis!

Perhatikan bahwa penggunaan operator resolusi ruang lingkup untuk mengakses fungsi anggota statis di luar ruang lingkupnya (dalam fungsi utama).

Penentu yang bisa berubah

Ingat, dari atas, bahwa jika objek instantiated dimulai dengan const, nilai dari setiap anggota data normalnya tidak dapat diubah. Dan untuk setiap anggota data seperti itu yang akan diubah, itu harus dideklarasikan, bisa berubah.

Program berikut menggambarkan hal ini:

#termasuk
menggunakan namespace std;
kelas Cla

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

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

Outputnya adalah:

'a"b"z"d'

Penentu thread_local

Dalam menjalankan program secara normal, satu segmen kode dieksekusi, kemudian segmen kode berikutnya, diikuti oleh segmen kode lain setelah itu, dan seterusnya. Itu adalah satu utas; utas utama. Jika dua segmen kode dieksekusi pada saat yang sama (durasi yang sama), maka utas kedua diperlukan. Hasil utas kedua bahkan mungkin sudah siap sebelum utas utama main.

Fungsi main() seperti utas utama. Sebuah program mungkin memiliki lebih dari dua utas untuk perilaku asinkron seperti itu.

Utas kedua membutuhkan ruang lingkup (cakupan blok) untuk beroperasi. Ini biasanya disediakan oleh ruang lingkup fungsi, sebuah fungsi. Variabel dalam lingkup luar yang dapat dilihat dalam lingkup utas kedua.

Program singkat berikut mengilustrasikan penggunaan specifier thread_local:

#termasuk
#termasuk
menggunakan namespace std;
thread_local int antar = 1;
batalkan fungsi_utas()

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

int utama()

utas thr(&fungsi_utas); // thr mulai berjalan
cout << inter << "st or main thread\n";
melalui.Ikuti(); // utas utama menunggu utas, thr selesai
kembali 0;

Outputnya adalah:

utas pertama atau utama
utas ke-2

Variabel, inter, didahului oleh thread_local, berarti inter memiliki instance terpisah di setiap thread. Dan itu dapat dimodifikasi di utas yang berbeda untuk memiliki nilai yang berbeda. Dalam program ini, ia diberi nilai, 1 di utas utama, dan dimodifikasi ke nilai, 2 di utas kedua.

Sebuah utas membutuhkan objek khusus untuk beroperasi. Untuk program ini, library yang disertakan dengan “#include ” memiliki kelas yang disebut utas, dari mana objek thr telah dipakai. Konstruktor untuk objek ini mengambil referensi ke fungsi utas sebagai argumen. Nama fungsi thread dalam program ini adalah thread_function().

Fungsi anggota join() untuk objek khusus, pada posisinya digunakan, membuat utas utama menunggu utas kedua selesai dieksekusi sebelum melanjutkan eksekusi, jika tidak, fungsi main() dapat keluar tanpa utas (kedua) memiliki membuahkan hasil.

Penentu eksternal

Secara sederhana, untuk deklarasi, memori tidak dialokasikan untuk variabel atau fungsi, sedangkan untuk definisi, memori dialokasikan. Kata cadangan eksternal memungkinkan variabel atau fungsi global dideklarasikan dalam satu file tetapi didefinisikan di file lain in. File tersebut disebut unit terjemahan untuk aplikasi C++ lengkap.

Ketik program berikut dan simpan dengan nama file, mainFile:

#termasuk
menggunakan namespace std;
intsayaInt;
const char ch;
batalkan myFn();
int utama()

myFn();
kembali 0;

Variabel, myInt, variabel konstan, ch, dan fungsi, myFn(), telah dideklarasikan tanpa didefinisikan.

Ketik program berikut dengan definisi, dan simpan dengan nama file, otherFile, di direktori yang sama:

#termasuk
menggunakan namespace std;
int myInt = 10;
const char ch = 'c';
batalkan myFn()

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

Cobalah untuk mengkompilasi aplikasi di terminal (prompt perintah DOS) dengan perintah berikut, dan perhatikan bahwa itu mungkin tidak dikompilasi:

file utama g++.cpp File lainnya.cpp -o selesai.exe

Sekarang, awali ketiga deklarasi di mainFile dengan kata "extern", sebagai berikut:

extern int myInt;
karakter const eksternal;
extern void myFn();

Simpan ulang file utama. Kompilasi aplikasi dengan:

file utama g++.cpp File lainnya.cpp -o selesai.exe

(Ini adalah bagaimana file terpisah untuk aplikasi yang sama dikompilasi dalam C++)

Dan itu harus dikompilasi. Sekarang, jalankan aplikasinya, selesai.exe, dan hasilnya harus:

myFn() mengatakan 10 dan c

Perhatikan bahwa dengan penggunaan "extern", variabel konstan dapat dideklarasikan dalam satu file tetapi didefinisikan di file lain. Saat berurusan dengan deklarasi dan definisi fungsi dalam file yang berbeda, penggunaan extern adalah opsional.

Kapan harus menggunakan eksternal? Gunakan ketika Anda tidak memiliki file header dengan deklarasi global.

"extern" juga digunakan dengan deklarasi template - lihat nanti.

Kesimpulan:

Variabel yang didahului dengan const dan/atau volatile adalah tipe yang memenuhi syarat cv. Variabel, tidak didahului dengan const atau volatile atau keduanya, adalah tipe cv-tidak memenuhi syarat.

Penentu kelas penyimpanan bersifat statis, dapat diubah, thread_local, dan eksternal. Ini mempengaruhi rentang hidup (durasi), tempat, dan cara kerja variabel dalam suatu aplikasi.

Kontrol & kelola gerakan mouse di antara beberapa monitor di Windows 10
Manajer Mouse Tampilan Ganda memungkinkan Anda mengontrol & mengonfigurasi gerakan mouse di antara beberapa monitor, dengan memperlambat gerakannya di...
WinMouse memungkinkan Anda menyesuaikan & meningkatkan gerakan penunjuk tetikus di PC Windows
Jika Anda ingin meningkatkan fungsi default penunjuk tetikus Anda, gunakan freeware WinMouse. Ini menambahkan lebih banyak fitur untuk membantu Anda m...
Tombol klik kiri mouse tidak berfungsi pada Windows 10
Jika Anda menggunakan mouse khusus dengan laptop, atau komputer desktop, tetapi but tombol klik kiri mouse tidak berfungsi pada Windows 10/8/7 untuk b...