C++

C++'da Kapsam

C++'da Kapsam
C++'daki bir varlığın bildirilebilen ve/veya tanımlanabilen bir adı vardır. Bir beyan bir tanımdır, ancak bir tanım mutlaka bir beyan değildir. Bir tanım, adlandırılmış varlık için bellek ayırır, ancak bir bildirim, adlandırılmış varlık için bellek ayırabilir veya ayırmayabilir. Bir bildirim bölgesi, bir varlığın (değişken) adının geçerli olduğu bir programın en büyük parçasıdır. Bu bölgeye kapsam veya potansiyel kapsam denir. Bu makale, C'de kapsam belirlemeyi açıklar++. Ayrıca, bu makaleyi anlamak için temel C++ bilgisi gereklidir.

Makale İçeriği

Deklaratif Bölge ve Kapsam

Bir bildirim bölgesi, bir varlık adının geçerli olduğu bir program metninin en büyük kısmıdır. Aynı varlığa atıfta bulunmak için niteliksiz adın kullanılabileceği (görüldüğü) bölgedir. Aşağıdaki kısa programı düşünün:

#Dahil etmek
ad alanı std kullanarak;
geçersiz fn()

int var = 3;
eğer (1==1)

cout<

int ana()

fn();
0 döndür;

fn() fonksiyonunun iki bloğu vardır: if-koşulu için bir iç blok ve fonksiyon gövdesi için bir dış blok. Tanımlayıcı, var, dış blokta tanıtılır ve görülür. Ayrıca cout deyimi ile iç blokta da görülmektedir. Dış ve iç bloklar, var adının kapsamıdır.

Bununla birlikte, var adı, iç blokta bir kayan nokta gibi farklı bir varlık bildirmek için hala kullanılabilir. Aşağıdaki kod bunu göstermektedir:

#Dahil etmek
ad alanı std kullanarak;
geçersiz fn()

int var = 3;
eğer (1==1)

kayan nokta var = 7.5;
cout<

int ana()

fn();
0 döndür;

çıktı 7.5. Bu durumda, var adı, dış blokta tanıtılan (bildirilen) 3 değerindeki tamsayıya atıfta bulunmak için artık iç blokta kullanılamaz. Bu tür iç bloklar, dış blokta bildirilen varlıklar için potansiyel kapsam olarak adlandırılır.

Not: Dış bloktaki gibi aynı türden bir varlık, iç blokta hala bildirilebilir. Ancak bu durumda iç blokta geçerli olan yeni bildirim ve anlamı iken, eski bildirim ve iç blok dışındaki anlamı dış blokta geçerliliğini korur.

Bir iç blokta aynı adı taşıyan bir bildirim, normalde bu iç bloğun dışında aynı adı taşıyan bildirimi geçersiz kılar. İç bloklar diğer iç blokları yuvalayabilir.

Küresel Kapsam

Bir programcı bir dosya yazmaya başladığında, bu genel kapsamdır. Aşağıdaki kısa program bunu göstermektedir:

#Dahil etmek
ad alanı std kullanarak;
kayan nokta var = 9.4;
int ana()

cout <cout <<::var<<'\n';
0 döndür;

Çıktı:
9.4
9.4

Bu durumda, var için bildirim bölgesi veya kapsamı, var için bildirim noktasından başlar, dosyanın sonuna kadar aşağı doğru devam eder (çeviri birimi).

main() işlevinin bloğu farklı bir kapsamdır; küresel kapsam için iç içe geçmiş bir kapsamdır. Global kapsamın bir varlığına farklı bir kapsamdan erişmek için, tanımlayıcı doğrudan veya öncesinde kapsam çözümleme operatörü kullanılır: .

Not: main() varlığı, global kapsamda da bildirilir.

Blok Kapsamı

if, while, do, for veya switch ifadelerinin her biri bir blok tanımlayabilir. Böyle bir ifade bileşik bir ifadedir. Bir blokta bildirilen bir değişkenin adı, bir bloğun kapsamına sahiptir. Kapsamı, beyan noktasında başlar ve bloğunun sonunda biter. Aşağıdaki kısa program, ident değişkeni için bunu göstermektedir:

#Dahil etmek
ad alanı std kullanarak;
int ana()

eğer (1==1)

/*bazı ifadeler*/
int kimlik = 5;
cout</*bazı ifadeler*/

0 döndür;

Blok kapsamında bildirilen ident gibi bir değişken yerel bir değişkendir.

Blok kapsamı dışında ve üzerinde bildirilen bir değişken bloğun başlığında görülebilir (e.g., if bloğu için koşul) ve ayrıca blok içinde. Aşağıdaki kısa program, identif değişkeni için bunu göstermektedir:

#Dahil etmek
ad alanı std kullanarak;
int ana()

int tanım = 8;
eğer (tanım == 8)

cout<
0 döndür;

çıktı 8. Burada iki blok kapsamı vardır: main() işlevi için blok ve iç içe if-bileşik ifadesi. İç içe blok, main() fonksiyon bloğunun potansiyel kapsamıdır.

Bir blok kapsamında tanıtılan bir bildirim bloğun dışında görülemez. Derlemeyen aşağıdaki kısa program bunu variab değişkeni ile göstermektedir:

#Dahil etmek
ad alanı std kullanarak;
int ana()

eğer (1 == 1)

int değişken = 15;

cout<0 döndür;

Derleyici, değişken için bir hata mesajı üretir.

Bileşik işlevin başlığında tanıtılan, bildirilen bir varlık, bileşik ifadenin dışında (aşağıda) görülemez. Aşağıdaki for-loop kodu derlenmeyecek ve bir hata mesajıyla sonuçlanacaktır:

#Dahil etmek
ad alanı std kullanarak;
int ana()

for (int i=0; ben<4; ++i)

cout<
cout<0 döndür;

Yineleme değişkeni, i, for-loop bloğunun içinde görülür ancak for-loop bloğunun dışında görülmez.

İşlev Kapsamı

Fonksiyon bloğunda bir fonksiyon parametresi görülüyor. Bir fonksiyon bloğunda bildirilen bir varlık, bildirim noktasından fonksiyon bloğunun sonuna kadar görülür. Aşağıdaki kısa program bunu göstermektedir:

#Dahil etmek
#Dahil etmek
ad alanı std kullanarak;
dizge fn(dize dizgi)

char stri[] = "muz";
/*diğer ifadeler*/
string toplamStr = str + stri;
dönüş totalStr;

int ana()

string totStr = fn("yemek ");
cout<0 döndür;

Çıktı:
muz yemek

Not: Fonksiyonun dışında (üzerinde) bildirilen bir varlık, fonksiyon parametre listesinde ve ayrıca fonksiyon bloğunda görülebilir.

Etiket

Bir etiketin kapsamı, içinde göründüğü işlevdir. Aşağıdaki kod bunu göstermektedir:

#Dahil etmek
ad alanı std kullanarak;
geçersiz fn()

etikete git;
/*diğer ifadeler*/
labl: int inte = 2;
cout<
int ana()

fn();
0 döndür;

çıktı 2.

Numaralandırma Kapsamı

Kapsamsız Numaralandırma
Aşağıdaki if bloğunu göz önünde bulundurun:

eğer (1==1)

numaralandırma a, b, c=b+2;
cout<

çıktı 0 1 3.

Bloktaki ilk satır bir numaralandırmadır, a, b ve c onun numaralandırıcılarıdır. Bir numaralandırıcının kapsamı, bildirim noktasından numaralandırmanın çevreleyen bloğunun sonuna kadar başlar.

Aşağıdaki ifade derlenmeyecektir çünkü c'nin bildirim noktası a'nınkinden sonradır:

numaralandırma a=c+2, b, c;

Numaralandırıcılara, numaralandırmanın çevreleyen bloğundan sonra erişildiğinden, aşağıdaki kod kesimi derlenmeyecektir:

eğer (1==1)

numaralandırma a, b, c=b+2;

cout<Yukarıdaki numaralandırma kapsamsız bir numaralandırma olarak tanımlanır ve numaralandırıcıları kapsamsız numaralandırıcılar olarak tanımlanır. Bunun nedeni, yalnızca ayrılmış sözcük olan enum ile başlamasıdır. enum sınıfı veya enum yapısı ile başlayan numaralandırmalar, kapsamlı numaralandırmalar olarak tanımlanır. Numaralandırıcıları kapsamlı numaralandırıcılar olarak tanımlanır.

Kapsamlı Numaralandırma
Aşağıdaki ifade tamam:

enum sınıfı adı a, b, c=b+2;

Bu, kapsamlı bir numaralandırma örneğidir. Sınıfın adı nam. Burada, numaralandırıcının kapsamı, bildirim noktasından numaralandırma tanımının sonuna kadar başlar, numaralandırma için çevreleyen bloğun sonu değil. Aşağıdaki kod derlenmeyecek:

eğer (1==1)

enum sınıfı adı a, b, c=b+2;
cout<

Sınıf Kapsamı

Normal kapsam belirlemede, bildirimsel bölge bir noktadan başlar, sonra devam eder ve farklı bir noktada durur. Kapsam tek bir sürekli bölgede var. Sınıfla, bir varlığın kapsamı, birbirine bağlı olmayan farklı bölgelerde olabilir. İç içe bloklar için kurallar hala geçerlidir. Aşağıdaki program bunu göstermektedir:

#Dahil etmek
ad alanı std kullanarak;
//Temel sınıf
sınıf Cla

özel:
int meP = 5;
korumalı:
int mePro = 9;
halka açık:
geçersiz fn()

cout<
;
//Türetilmiş sınıf
sınıf DerCla: genel Cla

halka açık:
int derMem = memPro;
;
int ana()

Kla nesnesi;
nesne.fn();
DerCla derObj;
cout<0 döndür;

Çıktı:
5
9

Cla sınıfında, memP değişkeni, bildirim noktasında görülür. Bundan sonra, "korumalı"nın kısa kısmı atlanır, ardından sınıf üyesi fonksiyon bloğunda tekrar görülür. Türetilmiş sınıf atlanır, ardından main() işlev kapsamında (blok) tekrar görülür.

Cla sınıfında, memPro değişkeni, bildirim noktasında görülür. Genel işlevin fn() kısmı atlanır, ardından türetilmiş sınıf açıklama bloğunda görülür. main() işlevinde tekrar aşağıda görülür.

Kapsam Çözünürlük Operatörü
C++'daki kapsam çözümleme operatörü :: . Sınıfın statik bir üyesine erişmek için kullanılır. Aşağıdaki program bunu göstermektedir:

#Dahil etmek
ad alanı std kullanarak;
sınıf Cla

halka açık:
statik int const mem = 5;
halka açık:
statik boşluk fn()

cout<
;
int ana()

cout<Cla::fn();
0 döndür;

Çıktı:
5
5

Statik üyeler, kapsam çözümleme operatörü kullanılarak erişilen main() fonksiyon bloğunda görülür.

Şablon Parametre Kapsamı

Bir şablon parametre adının normal kapsamı, aşağıdaki kodda olduğu gibi, bildirim noktasından bloğunun sonuna kadar başlar:

şablon yapı yaşları

T John = 11;
U Peter = 12.3;
T Mary = 13;
U Sevinç = 14.6;
;

U ve T blok içinde görülüyor.

Bir şablon işlevi prototipi için, kapsam, aşağıdaki ifadede olduğu gibi, bildirim noktasından işlev parametre listesinin sonuna kadar başlar:

şablon void işlevi (T no, U cha, const char *str );

Ancak, sınıf tanımına (tanım) gelince, kapsam aşağıdaki kodda olduğu gibi farklı kısımlarda da olabilir:

#Dahil etmek
ad alanı std kullanarak;
şablon sınıf TheCla

halka açık:
T sayısı;
statik U ch;
void func (U cha, const char *str)

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

statik boşluk eğlencesi (U ch)

if (ch == 'a')
cout << "Official static member function" << '\n';

;
int ana()

TheCla nesne;
nesne.sayı = 12;
nesne.func('$', "500");
0 döndür;

İsim Gizleme

Aynı nesne türünün adı iç içe geçmiş bir blokta yeniden bildirildiğinde ad gizleme örneği oluşur. Aşağıdaki program bunu göstermektedir:

#Dahil etmek
ad alanı std kullanarak;
geçersiz fn()

int var = 3;
eğer (1==1)

int var = 4;
cout<
cout<
int ana()

fn();
0 döndür;

Çıktı:
4
3

Bunun nedeni, iç içe bloktaki var'ın dış bloktaki var'ı gizlemesidir.

Aynı Kapsamda Tekrar Bildirim İmkanı

Bildirgenin amacı, adın (ilk kez) kapsamına girdiği yerdir.

Fonksiyon Prototipi
Farklı varlıklar, hatta farklı türler bile normalde aynı kapsamda bildirilemez. Ancak, bir fonksiyon prototipi aynı kapsamda birden çok kez bildirilebilir. İki fonksiyon prototipi ve karşılık gelen fonksiyon tanımına sahip aşağıdaki program bunu göstermektedir:

#Dahil etmek
ad alanı std kullanarak;
void fn(int sayı);
void fn(int sayı);
void fn(int num)

cout<
int ana()

fn(5);
0 döndür;

Program çalışır.

Aşırı yüklenmiş fonksiyonlar
Aşırı yüklenmiş işlevler, aynı ada sahip ancak farklı işlev imzalarına sahip işlevlerdir. Başka bir istisna olarak, aynı isimde aşırı yüklenmiş fonksiyonlar aynı kapsamda tanımlanabilir. Aşağıdaki program bunu göstermektedir:

#Dahil etmek
ad alanı std kullanarak;
void fn(int num)

cout<
void fn(şamandıra no)

cout<
int ana()

fn(5);
yüzer flt = 8.7;
fn(flt);
0 döndür;

Çıktı:
5
8.7

Aşırı yüklenmiş fonksiyonlar global kapsamda tanımlanmıştır.

Ad Alanı Kapsamı

Ad Alanı Kapsamı kendi makalesini hak ediyor. Söz konusu yazı bu web sitesi için yazılmıştır, linuxhint.com. Bu sitenin (sayfa) arama kutusuna “Ad Alanı Kapsamı” arama kelimelerini yazmanız ve Tamam'ı tıklamanız yeterlidir; makaleyi alacaksınız.

Farklı Kısımlarda Kapsam

Sınıf, kapsamın farklı bölümlerde olabileceği tek şema değildir. Arkadaş belirteci, ayrıntılı tip belirtecinin belirli kullanımları ve kullanım yönergeleri, kapsamın farklı yerlerde olduğu diğer şemalardır - ayrıntılar için daha sonra bakın.

Sonuç

Kapsam, bildirime dayalı bir bölgedir. Bir bildirim bölgesi, bir varlık adının geçerli olduğu bir program metninin en büyük kısmıdır. İç içe bloklar gibi belirli programlama şemalarına göre birden fazla bölüme ayrılabilir. Bildirim noktasına sahip olmayan kısımlar potansiyel kapsamı oluşturur. Potansiyel kapsam beyana sahip olabilir veya olmayabilir.

Linux'ta oyun oturumunuzu nasıl yakalar ve yayınlarsınız?
Geçmişte oyun oynamak sadece bir hobi olarak görülüyordu, ancak zamanla oyun endüstrisi teknoloji ve oyuncu sayısı açısından büyük bir büyüme gördü. Ç...
El Takibiyle Oynanabilecek En İyi Oyunlar
Oculus Quest kısa süre önce, kontrolörler olmadan elle takip etme harika fikrini tanıttı. Resmi olarak veya SideQuest aracılığıyla destek sağlayan sür...
Tam Ekran Linux Uygulamalarında ve Oyunlarında OSD Yerleşimi Nasıl Gösterilir
Tam ekran oyunlar oynamak veya uygulamaları dikkat dağıtmayan tam ekran modunda kullanmak, bir panelde veya görev çubuğunda görünen ilgili sistem bilg...