Nesnelerin Özellikleri
- Üye nesneler - friend belirtesi - Nesnelerin operatörlere yüklenmesi - this yerel (lokal) değişkeni - inline tanımlı üye fonksiyonlar - Ortak genel (global) değişkenler - Nesne göstericileri - Nesne dizileri
4.1 Nesne üyesi nesneler Bir nesnenin üye değişkenleri arasında diğer nesneler de yer alabilir. Kullanıp kullanmama bakımından nesnelerin diğer değişkenlerden bir farkı yoktur. class A {int i; //… public: A(); A(A&); A(int); //… }; class B {A a, b; //… public: B(); B(B&); A(int, int); //… };
İkinci sınıfın koıdlamasında ne olabılır? •B::B() {…} //A için otomatikman çalışır •B::B() // tasarımcı ‘by default’ : a(32), b(21) // her değişken için // ayrı bir (sabit) tasarımcı {…} •B::B(int u, int v) // ‘normal’ tasarımcı : a(u), b(v) // ilk değerlerde bir fark olabilir {…}
// nokta.cpp -- Demonstrates a simple class (I) #include class Nokta { float X, Y, Z; //access rights?? public: Nokta (float=0, float=0, float=0); //tasarımcı tipi? Nokta (Nokta&); // --- "" ---? int Tasi (float, float, float); // member function int Yaz (); // member function float Uzaklik (Nokta&); // member function };
Class implementation (I) Nokta:: Nokta (float x, float y, float z) { X=x; Y=y; Z=z; } Nokta:: Nokta ( Nokta& N) {X=N.x; Y=N.y; Z=N.z; } int Nokta:: Yaz () { printf("%f, %f, %f", X, Y, Z); } #define DIFSQR (p) ((p-Ikinci*##p)*(p-Ikinci*##p) float Nokta:: Uzaklik (Nokta& Ikinci) return sqrt(DIFSQR(X)+ DIFSQR(Y) + DIFSQR(Z)) #undef DIFSQR
İkinci sınıf (Ia) class Dogru { Nokta Baslangıc, Bitis; public: Dogru (Nokta&, Nokta&); Dogru (Dogru&); float Uzunluk (); int Yaz (); };
Class implementation (Ia) Dogru:: Dogru (Nokta&, Nokta&) : Baslangıc(A), Bitis(B) {} Dogru:: Dogru ( Dogru& D ) : Baslangıc(D.Baslangıc), Bitis(D.Bitis) {} float Dogru: Uzunluk () { return Baslangıc.Uzaklık(Bitis); } int Dogru:: Yaz () { printf ("["); Baslangıc.Yaz(); Printf ("-"); Bitis.Yaz(); printf ("]"); return 0; }
Main() program I #include void main() { Nokta A; Nokta B(30, 40, 50); clrscr; A.Yaz(); printf ("/n"); B.Yaz(); printf("/niki nokta arasindaki mesafe=%f\n", A.Uzaklik(B)); B.Tasi(10, -10, 60); Dogru D( Nokta (10, 20, 30), B); D.Yaz(); printf("/dogrunun uzakligi=%f\n", D.Uzunluk()); return 0; }
4.2 Friend (Arkadaş) Bilertici #include class Nokta { float X, Y, Z; public: Nokta (float=0, float=0, float=0); Nokta (Nokta&); int Tasi (float, float, float); friend int Yaz (Nokta&); friend float Uzaklik (Nokta&, Nokta&); };
Class ımplementatıon (II) Fonksıyonlarda bir değişiklik : int Yaz () { printf("%f, %f, %f", N.X, N.Y, N.Z); } float Uzaklik (Nokta& Birinci, Nokta & İkinci) { return sqrt( (Birinci.X – İkinci.X)*(Birinci.X – İkinci.X) + (Birinci.Y – İkinci.Y)*(Birinci.Y – İkinci.Y)+ (Birinci.Z – İkinci.Z)*(Birinci.Z – İkinci.Z) ); }
Sınıf (IIa) class Dogru { Nokta Baslangic, Bitis; public: Dogru (Nokta&, Nokta&); Dogru (Dogru&); float Uzunluk (); friend int Yaz (); };
Class Implementatıon (IIa) Aynı, hariç: int Yaz (Dogru& D) { printf ("["); Yaz(D.Baslangıc); printf ("-"); Yaz(D.Bitis); printf ("]"); return 0; }
Main() program (II) #include void main() { Nokta A; Nokta B(30, 40, 50); clrscr; Yaz(A); printf ("/n"); Yaz(B); printf("/niki nokta arasındaki mesafe=%f\n", Uzaklik(A,B)); B.Tasi(10, -10, 60); Dogru D( Nokta (10, 20, 30), B); Yaz(D); printf("/dogrunun uzaklığı=%f\n", D.Uzunluk()); return 0; }
class A { friend class B; // friend için: private, public, protected – önemi yok! // data members and member functions }; class B { // A sınıfın tüm dataları (private, protected bile) kullanabilir ! //... } Arkadaş-sınıf
4.3 Nesnelerin Operatörlere Yüklenmesi class Vector {public: float X, Y, Z; Vector ( float=0, float=0, float=0 ); Vector (Vector&); } Vector:: Vector (float a, float b, float c) {X=a; Y=b; Z=c; } Vector:: Vector (Vector & v) { X=v.X; Y=v.Y; Z=v.Z; }
Operatörler: Vector& operator + (Vector& A, Vector& B) {return Vector(A.X+B.X, A.Y+B.Y, A.Z+B.Z); } Vector & operator – (Vector & A, Vector & B) {return Vector (A.X-B.X, A.Y-B.Y, A.Z-B.Z); } //bu tanımlamalardan sonra...
Vector A(3, 4); Vector B(8, 6.513, 1); Vector C = A + B; Vector D = A - B; float f = 67; Vector E = A - Vector (16, 1, -10)+ Vector (f, f*3,f/4); //yazmak mümkün olacaktır. Fakat * operasyon için // (Vector*float) 2 fonksiyon yazmak gerekiyor! Neden?
4.4 this Yerel Değişkeni void Nokta::Rapor() { printf(“Bu nokta ”); Yaz(*this); printf(“konumundadir\n”); } Nokta::Nokta (float X, float Y, float Z ) { this->X=X; this->Y=Y; this->Z=Z; }
4.5 Genel Ortak Değişkenler Her nesne sahip olduğunu bilgileri dığer tüm nesnelere karşi korur. Eğer bazı bilgilerin sahipsizce tüm programlama öğeleri tarafından kullanılması istenirse, bu değişkenler global olarak tanımlanırlar. Eğer bir değişkeni sadece belli bir sınıfa mensup nesnelerin kullanması istenirse, bu istek sınıf tanımlaması içinde bildirilir. Bu bildiri değişken tanımlamasının başina static kelimesi ilave edilerek yapılır.
#include //static1.cpp #include class Test { int a; static int b; public: Test(int a, int x) {this->a=a; b+=x;} int SayA() {return a;} int SayB() {return b;} }; int Test::b; main() { Test A(5, 10); cout<<"A a = "<<A.SayA()<<" A b = "<<A.SayB()<<endl; Test B(8, 15); cout<<"B a = "<<B.SayA()<<" B b = "<<B.SayB()<<endl; cout<<"A a = "<<A.SayA()<<" A b = "<<A.SayB()<<endl; return 0; } // static nesneler de olabilir: static Nokta(8, 7, -12);
4.6 Durağan ( static ) fonksiyonlar //STATIC.CPP //////// #include class Static_Test { int X; static int Y; public: Static_Test(int); int X_Value(); void Auto_Display(); static void Static_Display(); static void Static_Message(); };
int Static_Test::Y=300; Static_Test::Static_Test(int x) {X=x;} int Static_Test::X_Value(){return X;} //automatic function definition void Static_Test::Auto_Display() { printf("x= %d\t", X); printf("** %d **\n", X_Value()); printf("y= %d\n", Y); Static_Message(); //static function call }
//static function definition void Static_Test::Static_Display() { /* printf("x= %d\t", X); // Error! No object! printf("** %d **\n", X_Value()); // Error! Use. or -> to call Static_Test::X_Value with an object! */ printf("y= %d\n", Y); Static_Message(); }
void Static_Test::Static_Message() { printf("Static_Test, Static_Message function\n"); } ///////////////////////////////////////////////////// main() { Static_Test A(8); A.Auto_Display(); // Static_Test::Auto_Display(); - Error ! A.Static_Display(); printf("\n"); Static_Test::Static_Display(); return 0; }
4.7 const Fonksiyonlar Tamamlasının sonunda const (sabıt) kelimesi bulunan fonksiyonlar bilgi fonksiyonu olarak adlandırılırlar. Bu fonksionlar üye değişkenlerin değerlerini değişteremiyecekleri gibi fonksiyonu olmayan diğer fonksiyonları da çağıramazlar. class sınıf_adı {…int const_fonksiyon(…) const ;…} int sınıf_adı:: const_fonksiyon(…) const {… return değer;}