C++'da Kapsam

Scope C



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++'da kapsam belirlemeyi açıklar. Ayrıca, bu makaleyi anlamak için temel C++ bilgisi gereklidir.

Makale İçeriği

Deklaratif Bölge ve Kapsam

Bildirim bölgesi, bir varlık adının geçerli olduğu bir program metninin en büyük parçasıdır. Niteliksiz ismin aynı varlığa atıfta bulunmak için kullanılabileceği (görüldüğü) bölgedir. Aşağıdaki kısa programı düşünün:







#Dahil etmek
kullanarak ad alanısaat;

geçersizfn()
{
intnerede= 3;
Eğer (1==1)
{
maliyet<<nerede<<' ';
}
}

intana()
{
fn();
dönüş 0;
}

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, tanıtılır ve dış blokta 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
kullanarak ad alanısaat;

geçersizfn()
{
intnerede= 3;
Eğer (1==1)
{
batmadan yüzmeknerede= 7.5;
maliyet<<nerede<<' ';
}
}

intana()
{
fn();
dönüş 0;
}

Çıktı 7.5'tir. 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ürdeki 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 korumaktadır.

Bir iç blokta aynı ada sahip bir bildirim, normalde bu iç blok dışında aynı ada sahip 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
kullanarak ad alanısaat;

batmadan yüzmeknerede= 9.4;

intana()
{
maliyet <<nerede<<' ';
maliyet <<::nerede<<' ';

dönüş 0;
}

Çı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 (çeviri birimi) sonuna kadar aşağı doğru devam eder.

main() işlevinin bloğu farklı bir kapsamdır; küresel kapsam için iç içe 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ığı da global kapsamda 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
kullanarak ad alanısaat;

intana()
{
Eğer (1==1)
{
/*bazı ifadeler*/
intkimlik= 5;
maliyet<<kimlik<<' ';
/*bazı ifadeler*/
}
dönüş 0;
}

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 (örneğin, if-block koşulu) ve ayrıca blok içinde görülebilir. Aşağıdaki kısa program, identif değişkeni için bunu göstermektedir:

#Dahil etmek
kullanarak ad alanısaat;

intana()
{
intkimlik= 8;

Eğer (kimlik== 8)
{
maliyet<<kimlik<<' ';
}
dönüş 0;
}

Çıktı 8'dir. 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
kullanarak ad alanısaat;

intana()
{
Eğer (1 == 1)
{
intdeğişken= on beş;
}
maliyet<<değişken<<' '; //hata: kapsamı dışından erişildi.

dönüş 0;
}

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
kullanarak ad alanısaat;

intana()
{
için (intben=0;ben<4; ++ben)
{
maliyet<<ben<<'';
}
maliyet<<ben<<'';

dönüş 0;
}

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ür. 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
kullanarak ad alanısaat;

dize fn(dize str)
{
karakterçizgi[] = 'muz';
/*diğer ifadeler*/
string totalStr=P+çizgi;
dönüştoplamStr;
}

intana()
{
dize totStr=fn('yemek yiyor ');
maliyet<<totStr<<' ';

dönüş 0;
}

Çı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
kullanarak ad alanısaat;

geçersizfn()
{
gitetiket;
/*diğer ifadeler*/
etiket: intOlumsuz= 2;
maliyet<<Olumsuz<<' ';
}

intana()
{
fn();

dönüş 0;
}

Çıktı 2'dir.

Numaralandırma Kapsamı

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

Eğer (1==1)
{
Sıralama {bir, b, c=B+2};
maliyet<<ile<<''<<B<<''<<C<<' ';
}

Çıktı 0 1 3'tür.

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:

Sıralama {ile=C+2, M.Ö};

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

Eğer (1==1)
{
Sıralama {bir, b, c=B+2};
}
maliyet<<ile<<''<<B<<''<<C<<' '; //hata: kapsam dışı

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:

Sıralama sınıferkek{bir, 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)
{
Sıralama sınıferkek{bir, b, c=B+2};
maliyet<<ile<<''<<B<<''<<C<<' '; //hata: enum sınıfı veya enum yapısı için kapsam dışı
}

Sınıf Kapsamı

Normal kapsam belirleme ile, bildirim bölgesi bir noktadan başlar, sonra devam eder ve farklı bir noktada durur. Kapsam tek bir sürekli bölgede bulunur. Sınıf ile 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
kullanarak ad alanısaat;

//Temel sınıf
sınıfKla
{
özel:
intmemP= 5;
korumalı:
intmemPro= 9;
halka açık:
geçersizfn()
{
maliyet<<memP<<' ';
}
};

//Türetilmiş sınıf
sınıfDerCla: halka açıkKla
{
halka açık:
intderMem=memPro;
};
intana()
{
kla nesne;
nesnefn();
DerCla derObj;
maliyet<<derObj.derMem<<' ';

dönüş 0;
}

Çıktı:
5
9

Cla sınıfında, memP değişkeni, bildirim noktasında görülür. Bundan sonra, protected öğesinin 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
kullanarak ad alanısaat;

sınıfKla
{
halka açık:
statik int constmeme= 5;
halka açık:
statik geçersizfn()
{
maliyet<<meme<<' ';
}
};
intana()
{
maliyet<<Kla::meme<<' ';
Kla::fn();

dönüş 0;
}

Çı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<tür adıT,tür adısen> yapıYaşlar
{
John= on bir;
sen Peter= 12.3;
Meryem= 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<tür adıT,tür adısen> geçersizişlev(sen hayır, sen,const karakter *P);

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
kullanarak ad alanısaat;

şablon<sınıfT,sınıfsen> sınıfTheCla
{
halka açık:
t sayısı;
statiku ch;

geçersizişlev(baba,const karakter *P)
{
maliyet << 'Var ' <<birde<< 'kitapların değeri' <<numara<<P<< ' mağazada.' << ' ';
}
statik geçersizeğlence(u ch)
{
Eğer (ch== 'ile')
maliyet << 'Resmi statik üye işlevi' << ' ';
}
};

intana()
{
TheCla<int,karakter>nesne;
nesnebirde = 12;
nesneişlev('$','500');

dönüş 0;
}

İ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
kullanarak ad alanısaat;

geçersizfn()
{
intnerede= 3;
Eğer (1==1)
{
intnerede= 4;
maliyet<<nerede<<' ';
}
maliyet<<nerede<<' ';
}

intana()
{
fn();
dönüş 0;
}

Çıktı:
4
3

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

Aynı Kapsamda Tekrar Bildirim İmkanı

Bildirinin 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 fazla bildirilebilir. İki fonksiyon prototipi ve karşılık gelen fonksiyon tanımına sahip aşağıdaki program bunu göstermektedir:

#Dahil etmek
kullanarak ad alanısaat;

geçersizfn(intbirde);
geçersizfn(intbirde);

geçersizfn(intbirde)
{
maliyet<<birde<<' ';
}

intana()
{
fn(5);

dönüş 0;
}

Program çalışıyor.

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
kullanarak ad alanısaat;

geçersizfn(intbirde)
{
maliyet<<birde<<' ';
}

geçersizfn(batmadan yüzmeknumara)
{
maliyet<<numara<<' ';
}

intana()
{
fn(5);
batmadan yüzmekflt= 8.7;
fn(flt);

dönüş 0;
}

Çıktı:
5
8.7

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

Ad Alanı Kapsamı

Namespace Scope kendi makalesini hak ediyor. Söz konusu yazı linuxhint.com adlı bu site için yazılmıştır. Sadece bu sitenin (sayfa) arama kutusuna Ad Alanı Kapsamı arama kelimelerini yazın ve Tamam'ı tıklayın, 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.

Çözüm

Kapsam, bildirimsel bir bölgedir. Bildirim bölgesi, bir varlık adının geçerli olduğu bir program metninin en büyük parçası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 bildirime sahip olabilir veya olmayabilir.