Get ve Set, isimlerinden de anlaşılacağı üzere veri atama ve veriyi çekmek için kullanılan metotlardır. Bu metotlar herhangi bir kütüphane ile ekli olarak gelmezler. Yazdığımız her bir öğe için get ve set'i kendimiz bir metot olarak yazmalıyız.
Get ve Set Neden Kullanılır?
Bir class veya struct içerisinde private olarak oluşturulan bir öğeye o class veya struct dışından erişmek mümkün değildir. Eğer farklı bir alandan private veriye ulaşmak veya değiştirmek istiyorsak get ve set metotlarını yazmalıyız.
Veri Atamak = Set
class SinifAdi{
int x;
public:
void setX(int x2) {
x = x2;
}
};
Veriye Erişmek = Get
class SinifAdi{
int x;
public:
int getX() {
return x;
}
};
Erişim ?
Mantıken sınıfların varsayılan private olarak geldiğini buradaki konumuzda öğrenmiştik. O zaman yukarıdaki 2 sınıfımızda da x değişkenimiz private olarak atanmış durumda. Bir private öğeye bulunduğu class dışından erişmek ve değeri alıp, değiştirmek mümkün değildir. O halde düzenleme yapacağımız class içerisinde public alanımıza yazdığımız get ve set metotları ile o x değerine erişebiliyoruz. O zaman getX() adında oluşturduğumuz metodumuz bize x değerini return edebilir. Aynı şekilde setX() metodumuzda içerisine aldığı değeri x'e atayabilir.
Main alanımızı bir inceleyelim;
int main(){
SinifAdi A;
A.x= 10; // Problem var! (x->PRIVATE, sınıf dışında değer atanamaz!)
cout << A.x; // Problem var! (x->PRIVATE, sınıf dışında çağırılamaz!)
}
Ama yazdığımız get ve set metotlarını kullanırsak;
int main(){
SinifAdi A;
A.setX(10); // Problem Yok (setX() metodu PUBLIC)
cout << A.getX(); // Problem Yok (getX() metodu PUBLIC)
}
Dikkat Edilmesi Gerek
Eğer public bir değişkene farklı bir class veya struct üzerinden değer atamak istiyorsak şöyle bir kullanım sergileyebiliriz;
int main(){
sinif Mert;
Mert.x = 10;
}
Ama eğer bir metot oluşturmuşsak (ki zaten setX() bir metot) eşitlik söz konusu değildir;
int main(){
sinif Mert;
Mert.setX(10);
}
Farklı İsimler
get ve set dışında farklı isimlerde verebilirsiniz. Lakin anlaşılması açısından bu tarz kullanım yaygındır. Kodu farklı kişiler incelediğinde rahatlıkla anlayabilir.
class SinifAdi{
int x;
public:
void xDegeriniDegistir(int x2) {
x = x2;
}
int xDegeriniAl() {
return x;
}
};
int main(){
SinifAdi Mert;
Mert.xDegeriniDegistir(25);
cout << Mert.xDegeriniAl();
}
Yukarıdaki kod blogumuzda problemsiz çalışır.
set() Metodunda Aynı İsim (this kullanımı)
setX() adı ile oluşturduğumuz yukardaki metotlarımızda farkettiğiniz üzere aldığı parametreyi x2 olarak tabir etmiştik. Peki biz aldığı parametre yerine de x yazarsak nasıl bir şekilde kullanmalıyız? (Sonuçta x=x yapamayız).
İşte tam bu anda karşımıza this çıkıyor. this ibaresi ile ana struct ya da class'taki değişkene ulaşmış oluruz. Şöyle bir setX() metodu da yazabiliriz:
class Sinif{
int x;
public:
void setX(int x) {
this->x = x;
}
};