YAZARLIK BAŞVURUSUBize Katılmak istermisiniz?

Friend Fonksiyonlar ve Nesne Pointerları

ARKADAŞ (FRİEND) FONKSİYONLAR

Bir fonksiyonun üyesi olmadıgı bir sınıfa ait özel (private) üyelere erisim hakkı olması istenebilir. Bu durumda arkadas (friend) fonksiyonlardan yararlanmak söz konusu olacaktır. Arkadas fonksiyonlar, sınıfın üye fonksiyonları degildir. Ancak o sınıfa iliskin özel elemanlara erisim hakkı vardır. Örnegin bir arkadas fonksiyon, testSinif sınıfı için su sekilde tanımlanabilir:

class testSinif
{
        özel üyeler
           public:
                 friend void arkadasFonk();
                …
};

Burada prototipi verilen arkadasFonk() isimli fonksiyon, programın daha sonraki satırlarında tanımlanacaktır. Bu tanım içinde, public tanımından önce yer alan sınıfın özel üyelerine erisim hakkı vardır. Arkadas fonksiyonlar, farklı türdeki iki sınıfın karsılastırılmasında kullanılabilir. Bu fonksiyonlar, özellikle iki sınıfın aynı fonksiyonu paylasması amacıyla kullanılır. Arkadas fonksiyonların sınıfın özel (private) üyelerine erisim hakkı vardır!

Class testSinif
{
       private:
Özel degiskenler…
        public:
            …
      friend void arkadas();
           …
};
void arkadas() 
{
             Özel degiskenler
}

Burada dikkat edilirse arkadas() fonksiyonu class’a ait bir fonksiyon değildir.Ancak class içerisinde friend olduğu belirtilerek class üyelerine erişim hakkı tanınmıştır.

 

Burada testSinif isimli bir arkadas fonksiyonu tanımlamaktadır. Bu fonksiyon testSinif sınıfının bir üye fonksiyonu degildir. Söz konusu arkadas fonksiyonu,testSinif sınıfının özel kullanıma açık; yani private olarak tanımlanmıs üyelerini kullanabilmektedir. Bu özel üyelerin içerdigi degerleri karsılastırarak, birbirlerine esit olup olmadıkları konusunda bir sonucun üretilmesine yardımcı olmaktadır.

NESNE Pointerları (Göstergeleri)

Gösterge(işaretçi , pointer) , bir degiskenin bellekteki adresini tutan bir degisken olarak düsünülür. Pointerlar , bir degisken için degil bir nesne için de belirleyebiliriz.Yani pointer değişkenin adresini gösteriyordu bizim için şimdiyse bir nesnenin adresini bir pointer ile tutabiliriz.

Bir nesneye, ona isaret eden bir gösterge yardımıyla da erisilebilir. Burada dikkat edilecek nokta, nesnelerin üyelerine yapılan basvuruların “->” isleci ile yapılmasıdır.

Yukarıda bes adet sayısal degeri bir nesne dizisi içine yerlestirdikten sonra, bu nesne dizisine bir gösterge atamak ve bu gösterge yardımıyla dizinin tüm elemanlarını görüntülemek istiyoruz;

p->oku() yerine (*p).oku() da yazılabilir.

NESNELER İÇİN this POİNTER’I

Bu bölümde this göstergesini tanımlayacagız. Bir üye fonksiyon her çagrıldıgında, kendisini çagıran nesneye isaret eden bir göstergeye
otomatik olarak aktarılır. Bu göstergeye this anahtar kelimesi ile ulasabiliriz. Örnegin asagıda belirtilen nesne tanımını göz önüne alalım:

class testSinif
{
                  int a;
..
};
Bir üye fonksiyon a degiskenine bir baslangıç degeri atayabilir:
     a=100;
Bu ifade aslında su sekildeki bir ifadenin kısa gösterimidir:
          this -> a=100;

Aşağıdaki programda 350 ve 150 gibi degerleri nesne degiskenlerine atadıktan sonra, bunların toplamını hesaplayarak görüntüleyecegiz. Bunu yaparken this göstergesinden yararlanacagız.

 

 

Nesnelerin Basvuru(Referans) Biçiminde Fonksiyonlara Geçirilmesi

Bir nesnenin bir fonksiyona nasıl geçirildigini biliyoruz. Böyle bir durumda, ilgili nesnenin bir kopyası olusturularak, bu kopyası fonksiyona aktarılıyordu. Bunun yerine, nesnenin bir kopyasını olusturmadan, bir referans biçiminde fonksiyona geçirilmesi söz konusu olabilir. Bu durumda, &  isareti yardımıyla nesne bir basvuru olarak fonksiyona geçirilir.
Örneğin;

void fonksiyon (testsinif &nesne)

Aşağı taraftaki C++ programını göz önüne alalım. Bu programda, testSinif isimli nesneyi kare() fonksiyonuna bir basvuru ile geçirmek istiyoruz. Bu program çalıstırıldıgında, kare(testSinif &d) deyimi ile d basvurusu nesneye geçiriliyor.

 

Program çıktısı;

81
121

 

 

Program çıktısı;
100
144
9
11
*****************
100
144
10
12

 

 

Add a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir