Saturday

31

December

2016


0

YORUM


Compe 225 | C++ Ders 16 Data/method hiding and redefinition

7 ay önce yazıldı

compe 225,data hiding,değişken,ders notları,erişme,method hidin,üstteki,veriable,davutkaraBu konu aslında global olarak veya bir üst scope da tanımlanmış bir değişkenin ve fonksiyonu tekrar tanımlayarak, her iki değerinede ulaşma yöntemidir. Yani diyelimki global bir değişken tanımladınız bu değişkene main içinde erişebilirsiniz aynı zamanda main içinde aynı isimde bir değişken tanımladınız, normal şekilde kullanıdığınızda değişken en yakında tanımlandığı değeri alacaktır ama siz bu yöntemle hem global deki değeri hemde son değere erişebiliyorsunuz.

Basit bir örnekle açıklayacak olursak.

#include <iostream>
using namespace std;
// Global değişkenler
int gA = 1;
int gB = 2;
int main(){
int gA = 4; // Global değişkenle aynı adı kullanarak tekrar bir tanımlama yapıyoruz.
cout << gA << endl; // En yakında ki değeri verir
cout << gB << endl; // Global değişken
// Başına 4nokta (fordot) koyarak aynı şekilde global değişkenede erişebildik.
cout << ::gA << endl; 
}

Yani özetle: Bir değişkenin başına :: (4dot-4nokta) koyarak global değişken olduğunu belirtiyoruz, bu sayede global değişkenin adını tekrar kullansak bile, 4dot sayesinde hem global e hemde tanımlı olduğu scope değerini alabiliyoruz.

Bu durumda her değişken ve fonksiyonu farklı farklı scope larda aynı isimlerde tanımlayabiliriz, bunu zaten biliyorduk, burda öğrendiğimiz şey bir üst scope daki tanıma nasıl erişebiliyoruz. Bunu 4 dot yöntemi ile yapıyoruz bu kadar.

Aynı şeyi class lardada yapabiliyoruz, bir adet parent (base) bir adet child(derived) class olduğunu düşünelim her ikisindede aynı isimde bir fonksiyon tanımladık, parent daki fonksiyonu parent kullanır childdaki fonksiyonu child kullanır, buraya kadar da tamam.

Peki ya child parent ın alt classı olduğu için parent ın fonksiyonunu kullanabilir mi ? Cevap evet kullanabilir. Bunuda yine aynı şekilde 4dot ile yapıyoruz, ancak bu kez 4dot ın başına parent class ın adını yazıyoruz.

#include <iostream>
using namespace std;
// Global en dışdaki fonksiyon.
int calcSq(int a){
return a*a;
};
class A1 {
public:
int gA;
int calcSq(int a){ // A1 class ının fonksiyon tanımı
return a*a;
}
void setA(int a){
gA = calcSq(a); // A1 classının
}
};
class A2 : public A1 {
public:
int calcSq(int a){ // A2 class ının fonksiyon tanımı
return a*a;
}
void setA(int a){
gA = calcSq(a); // A2 classının
gA = A1::calcSq(a); // İŞTE BU <<- Bu sayede A2 içinde A1 fonksiyonunu kullandık.
}
};
int main(){
A2 a;
cout << a.calcSq(4) << endl; // Tabiki A2 classının
}

 

 

Zor görünsede aslında bilmeniz gereken tek şey 4dot başka bir şey yok.