SlideShare a Scribd company logo
1 of 23
KBUZEM
Karabük Üniversitesi
Uzaktan Eğitim Araştırma ve Uygulama Merkezi
3. HAFTA
NESNEYE DAYALI PROGRAMLAMA
BLM225
Nesneye Dayalı Programlama
2
3. Fonksiyonların Aşırı Yüklenmesi( Function
overloading) ve çok biçimlilik
C++ da isimleri aynı yaptıkları işler farklı fonksiyonlar yazılabilir. Buna göre iki farklı
fonksiyon, parametrelerinin tipleri, sayıları veya sıraları farklı olmak koşulu ile aynı isme
sahip olabilirler. Derleyici hangi fonksiyonun çağrıldığını parametre listesine bakarak karar
verir. Aynı isimde birden fazla fonksiyonun tanımlanmasına fonksiyonların aşırı yüklenmesi
(function overloading) denir. Aşırı yüklenmiş fonksiyonlar, birbiriyle alakalı işlemlerin aynı
adla çağrılmasına izin vererek programın karmaşıklığını azaltabilirler.
Çok biçimlilik (polimorfizm), genel anlamda bir adın, birbirleriyle ilişkili fakat teknik açıdan
farklı iki veya daha fazla amaç için kullanılabilmesi yeteneğidir.
C++'da çok biçimlilik özelliği, fonksiyonlara yeni görev yükleme veya bir başka değişle
fonksiyonlara aşırı yükleme (function overloading) ile sağlanabilir. Aşağıdaki programı
inceleyiniz.
#include <conio.h>
#include <iostream.h>
#include <iostream>
#include <string>
#include <list>
using namespace std;
void print()
{
cout<<"printed"<<endl;
}
void print(char c, int a)
{
for(int i=0; i<a;i++)
{
cout<<c<<endl;
}
}
int main()
{
print();
print('a', 6);
getch();
return 0;
}
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
2
BLM225
Nesneye Dayalı Programlama
3
#include <iostream>
using namespace std;
void yaz(); //Bildirimler
void yaz(char);
void yaz(char, int);
int main()
{
yaz();
yaz('=');
yaz('+', 30);
cin.get();
return 0;
}
//--------------------------------------------------------------
// 45 defa * yazar
void yaz()
{
for(int j=0; j<45; j++) // herzaman 45 kez döner
cout << '*';
cout << endl;
}
//--------------------------------------------------------------
// belirtilen karakteri 45 kez yazar
void yaz(char ch)
{
for(int j=0; j<45; j++)
cout << ch;
cout << endl;
}
//--------------------------------------------------------------
// Belirtilen karakteri n kez yazar
void yaz(char ch, int n)
{
for(int j=0; j<n; j++) // n defa döner
cout << ch;
cout << endl;
}
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
3
BLM225
Nesneye Dayalı Programlama
4
Operatörlerin Aşırı Yüklenmesi( Operator Overloading)
C++'da, + , - , *, !, ++ gibi operatörlere fonksiyonlar yazarak bu operatörlere yeni işlevler
yüklenebilir. Sadece C++'da zaten var olan operatörler aşırı yüklenebilir. Örneğin C++'da var
olmayan '^' operatörü için üs almak üzere bir fonksiyon yazılamaz. Fonksiyonlar
tanımlanırken operatörün orjinalinde var olan operand sayısı değiştirilemez. Örneğin '+'
operatörü iki değişken değerini toplar. Değişken sayısı tek olamaz. Ayrıca daha önceki
konularda geçtiği gibi operatörlerin öncelik sırası değiştirilemez. Bir 4, -, *, ! gibi bir işlem
operatörlerine ‘operator’ sözcüğü ile yükleme yapılır. Örneğin toplama operatörü ‘+’
operatörüne “operator+” şeklinde isim verilerek yükleme yapılır. Operatrör aşırı yüklemesi
aşağıda gösterildiği gibi yapılır.
DönüşTipi operatorOperatörismi(parametre listesi)
{
// gerçekleştirilecek işlem
}
a
55
56
57
ekran
55
57
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
4
BLM225
Nesneye Dayalı Programlama
5
#include <conio.h>
#include <iostream.h>
#include <iostream>
using namespace std;
struct Mat {
int a,b;
};
void goster( Mat m){
cout<<"a="<<m.a<<endl;
cout<<"b="<<m.b<<endl;
}
Mat operator+(Mat mt1, Mat mt2)
{
Mat sonuc;
sonuc.a=mt1.a + mt2.a;
sonuc.b=mt1.b + mt2.b;
return sonuc;
}
int main( )
{
Mat sayi1;
Mat sayi2;
Mat toplam;
sayi1.a=5;
sayi1.b=4;
sayi2.a=5;
sayi2.b=4;
toplam=sayi1+sayi2;
cout<<"a="<<toplam.a<<endl;
cout<<"b="<<toplam.b<<endl;
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
5
BLM225
Nesneye Dayalı Programlama
6
goster(toplam);
getch();
return 0;
}
#include <conio.h>
#include <iostream.h>
#include <iostream>
using namespace std;
struct Mat
{
int a; int b;
};
Mat operator+(Mat x, Mat y)
{
Mat sonuc;
sonuc.a=x.a-y.a; sonuc.b=x.b-y.b;
return sonuc;
}
int main () {
int a,b;
a=5; b=4;
b=b+a;
cout<<b<<endl;
Mat m1,m2,m3;
m1.a=6; m1.b=4; m2.a=3; m2.b=5;
m3=m1+m2;
cout<<m3.a<< "," <<m3.b<<endl;
getch();
return 0;
}
Örnek olarak aşağıda verile programda ‘+’ operatörü iki karmaşık sayıyı toplamak için aşırı
yüklenmektedir.
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
6
BLM225
Nesneye Dayalı Programlama
7
#include <conio.h>
#include <iostream.h>
#include <iostream>
using namespace std;
#include <iostream>
struct KarmasikSayi{ // Karmaşık sayıları tanımlamak için bir yapı
float reel,sanal; // Reel ve sanal kısımlar
};
// + operatörünün karmaşık sayıları toplamak için yüklenmesi
KarmasikSayi operator+ (const KarmasikSayi &v1, const KarmasikSayi &v2)
{
KarmasikSayi sonuc; // sonucun yazılacağı yerel değişken
sonuc.reel=v1.reel+v2.reel; // reel kısımlar toplanıyor
sonuc.sanal=v1.sanal+v2.sanal; // sanal kısımlar toplanıyor
return sonuc; // sonuç çağıran programa döndürülüyor
}
void yaz (KarmasikSayi c){ //kompleks sayıları yazan print fonksiyonu
cout<< "reel= " << c.reel << " sanal= " << c.sanal << endl;
}
int main()
{
int a,b;
a=5;
b=1;
a=a+b;
cout<<"a="<<a<<endl;
KarmasikSayi c1,c2,c3; // Üç adet karmaşık sayı tanımlanıyor
c1.reel= 3;
c1.sanal= -1;
c2.reel= 2.5;
c2.sanal= 0.7;
c3= c1 + c2; // Burada + iki karmaşık sayıyı topluyor
yaz(c3);
getch();
return 0;
}
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
7
BLM225
Nesneye Dayalı Programlama
8
//prefix
#include <conio.h>
#include <iostream.h>
#include <iostream>
#include <string>
#include <list>
using namespace std;
struct Mat{
int x;
int y;
}m1;
void operator++(Mat m1)
{
Mat mr;
mr.x=(m1.x)+1;
mr.y=(m1.y)+1;
cout<<mr.x<<","<<mr.y<<endl;
}
int main()
{
m1.x=5; m1.y=5;
++m1;
m1.x++;
cout<<m1.x<<endl;
++m1;
getch();
return 0;
}
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
8
BLM225
Nesneye Dayalı Programlama
9
//prefix
#include <conio.h>
#include <iostream.h>
using namespace std;
struct Mat{
int x;
int y;
void operator++()
{
x++;
y++;
cout<<x<<","<<y<<endl;
}
}m1;
int main()
{
m1.x=5; m1.y=5;
++m1;
m1.x++;
cout<<m1.x<<endl;
++m1;
getch();
return 0;
}
//postfix
#include <conio.h>
#include <iostream.h>
using namespace std;
struct Mat{
int x;
int y;
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
9
BLM225
Nesneye Dayalı Programlama
10
void operator++(int)
{
x++;
y++;
cout<<x<<","<<y<<endl;
}
}m1;
int main()
{
m1.x=5; m1.y=5;
m1++;
m1.x++;
cout<<m1.x<<endl;
m1++;
getch();
return 0;
}
4.1 Yaşam alanı (scope)
Bir C++ programında global olarak tanımlanan bir değişkenle, yerel olarak tanımlanan bir
değişken aynı isme sahip olabilir. Bu durumda yerel olarak tanımlanan değişken global olarak
tanımlanan değişkene göre önceliğe sahiptir. Bir başka ifade ile en içte yer alan bloktaki
değişken bir üsttekini örter.
Yaşam alanı belirtme (scope Resolution)operatörü(::) kullanılarak örtülmüş olan verilere
erişerek kullanmak mümkün olmaktadır. (::) operatörü kısaca kapsam (scope) operatörü
olarak da ifade edilmektedir. Aşağıda verilen programı inceleyiniz.
#include <conio.h>
#include <iostream.h>
#include <iostream>
using namespace std;
int a=6;
int main( )
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
10
BLM225
Nesneye Dayalı Programlama
11
{
int a=5;
cout<<"a="<<a<<endl;
cout<<"a="<<::a<<endl;
getch();
return 0;
}
#include <conio.h>
#include <iostream>
#include <list>
using namespace std;
int main ()
{
int a=5;
int i;
for(i=0;i<3; i++)
{
a++;
int k=1;
}
k++; // error
getch();
return 0;
}
#include <conio.h>
#include <iostream.h>
#include <iostream>
using namespace std;
#include <iostream>
int k = 10; //global k
int main()
{
int k; //yerel k
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
11
BLM225
Nesneye Dayalı Programlama
12
for (k = 0; k < 5; ++k)
{
cout<< " yerel degisken " << k ;
cout<< " Global degisken " << ::k <<endl;
}
::k++;
cout<<endl;
cout<< " Donguden sonra n " ;
cout<< " yerel degisken " << k ;
cout<< " Global degisken " << ::k <<endl;
getch();
return 0;
}
İsim uzayı (Name Space)
Takım halinde bir yazılım geliştirmek için programcılar bir araya geldiklerinde, her programcı
kendine ait bir takım değişkenler ve fonksiyonlar tanımlar. Programlar bir araya getirildiğinde
ise aynı isimde birden fazla değişken ve fonksiyon tanımlaması ile karşılaşılabilir. Bu
durumda isim çakışması meydana gelir. Bunu önlemek için C++ de her programcının kendine
ait bir isim uzayı tanımlamasına imkân verilmiştir.
#include <conio.h>
#include <iostream.h>
#include <iostream>
using namespace std;
namespace zafer
{
int a = 5;
}
namespace salih
{
int a = 6;
}
int main () {
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
12
BLM225
Nesneye Dayalı Programlama
13
cout <<"zafer hocanin a
degiskeni="<<zafer::a << endl;
cout <<"salih hocanin a
degiskeni="<<salih::a << endl;
getch();
return 0;
}
#include <conio.h>
#include <iostream.h>
#include <iostream>
using namespace std;
namespace zafer
{
int a = 15;
}
namespace salih
{
int a = 6;
}
using namespace zafer;
//using namespace salih; hatalı satır
int main () {
cout<<a<<endl;
cout <<"zafer hocanin a degiskeni="<<zafer::a << endl;
cout <<"salih hocanin a degiskeni="<<salih::a << endl;
getch();
return 0;
}
#include <conio.h>
#include <iostream.h>
#include <iostream>
using namespace std;
namespace zafer
{
int a = 5;
int karesi(int a)
{
return a*a;
}
}
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
13
BLM225
Nesneye Dayalı Programlama
14
namespace salih
{
double a = 6;
}
int main () {
cout <<"zafer hocanin a degiskeni="<<zafer::a << endl;
cout <<"zafer hocanin a degiskeninin karesi="<<zafer::karesi(zafer::a) << endl;
cout <<"salih hocanin a degiskeni="<<salih::a << endl;
cout <<"salih hocanin a degiskeninin karesi="<<zafer::karesi(salih::a) << endl;
getch();
return 0;
}
Her bir isim uzayındaki değişkenler sadece o isim uzayı içinde tanınırlar. Aşağıda verilen
direktif,
using namespace std;
std isim uzayının kullanılacağını belirtir.
cin, cout ve endl fonksiyonları gibi C++ standart kütüphanesinde yer alan tüm değişkenler ve
fonksiyonlar bu isim uzayı içinde tanımlanmıştır. Bu direktifin verilmemesi halinde bu
fonksiyonları kullanmak için başlarına std yazmak gerekir.
Örnek:
Std::cout<<”merhaba”<<endl;
Std::cin>>x;
İsim uzayı tanımlama
Bir isim uzayı aşağıdaki şekilde tanımlanır.
namespace tanımlayıcı
{
Değişkenler;
}
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
14
BLM225
Nesneye Dayalı Programlama
15
Örnek:
namespace isimuzayı1
{
int a, b;
}
İsimuzayi1 de tanımlanan a ve b değişkenlerine erişmek için aşağıdaki şekilde kullanmak
gerekmektedir.
isimuzayi1::a=5;
isimuzayi1::b=7;
örnek
#include <conio.h>
#include <iostream.h>
#include <iostream>
using namespace std;
namespace isimuzayi1
{
int a = 5;
}
namespace isimuzayi2
{
double a = 3.1416;
}
int main () {
cout << isimuzayi1::a << endl;
cout << isimuzayi2::a << endl;
getch();
return 0;
}
#include <conio.h>
#include <iostream.h>
#include <iostream>
using namespace std;
namespace isimuzayi1
{
int a = 5;
}
namespace isimuzayi2
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
15
BLM225
Nesneye Dayalı Programlama
16
{
double a = 3.1416;
}
using namespace isimuzayi1;
int main ()
{
cout << a << endl;
cout << isimuzayi2::a << endl;
getch();
return 0;
}
Using bildirimi
Kullanımı kolaylaştırmak ve her değişkeni kullanırken değişken ismi önüne isim uzayı ismini
yazmamak için using bildirimi kullanılır. Her bir değişken için using bildirimi ayrı ayrı olarak
kullanılabileceği gibi, tüm isim uzayı için de kullanılabilir.
#include <conio.h>
#include <iostream.h>
#include <iostream>
using namespace std;
namespace zafer
{
int a = 5;
int karesi(int a)
{
return a*a;
}
}
namespace salih
{
double a = 6;
}
int main () {
using namespace zafer;
cout <<"zafer hocanin a degiskeni="<<a
<< endl;
getch();
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
16
BLM225
Nesneye Dayalı Programlama
17
return 0;
}
#include <conio.h>
#include <iostream.h>
#include <iostream>
using namespace std;
#include <conio.h>
#include <iostream.h>
#include <iostream>
using namespace std;
namespace zafer
{
int a = 5;
int karesi(int a)
{ return a*a; }
}
namespace salih
{
double a = 6.9;
double yazdir(){ return a;}
}
int main () {
using namespace zafer;
cout <<"zafer hocanin a degiskeni="<<a
<< endl;
cout <<"karesi "<<karesi(10) << endl;
cout <<salih::yazdir()<<endl;
getch();
return 0;
}
#include <iostream>
using namespace std;
namespace isimuzayi1
{
int x = 5;
int y = 10;
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
17
BLM225
Nesneye Dayalı Programlama
18
}
namespace isimuzayi2
{
double x = 3.1416;
double y = 2.7183;
}
int main ()
{
using isimuzayi1::x;
using isimuzayi2::y;
cout << x << endl;
cout << y << endl;
cout << isimuzayi1::y << endl;
cout << isimuzayi2::x << endl;
return 0;
}
Using bildirimi ile tüm isim uzayı bildirildikten sonra isim uzayı içinde tanımlanmış tüm
değişkenleri kullanırken önünde isim uzayı ismini belirtmeye gerek kalmaz. Bu durumda
using namespace olarak kullanılır.
#include <iostream.h>
#include <conio.h>
using namespace std;
namespace isimuzayi1
{
int x = 5;
int y = 10;
}
namespace isimuzayi2
{
double x = 3.1416;
double y = 2.7183;
}
int main ()
{
using namespace isimuzayi1;
cout << x << endl;
cout << y << endl;
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
18
BLM225
Nesneye Dayalı Programlama
19
cout << isimuzayi2::y << endl;
cout << isimuzayi2::x << endl;
getch();
return 0;
}
İsimuzayı aşağıdaki gibi de kullanılabilir.
#include <iostream>
using namespace std;
namespace isimuzayi1
{
int x = 5;
int y = 10;
}
namespace isimuzayi2
{
double x = 3.1416;
double y = 2.7183;
}
int main ()
{
{
using namespace isimuzayi1;
cout << x << endl;
cout << y << endl;
}
{
using namespace isimuzayi2;
cout << y << endl;
cout << x << endl;
}
return 0;
}
#include <conio.h>
#include <iostream.h>
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
19
BLM225
Nesneye Dayalı Programlama
20
#include <iostream>
#include <string>
#include <list>
using namespace std;
namespace p1
{
int a=5,b=6,c=7;
}
namespace p2
{
int a=1,b=2,c=3;
}
int main()
{
using p1::a; // int a=5;
using p2::a; // int a=1; error
a++;
cout<<a<<endl;
getch();
return 0;
}
4.2. Dinamik bellek kullanımı
Daha önceki derslerimizde yerel ve global değişkenlerden bahsedilmişti. Yerel değişkenler
tanımlandıkları blok içinde veya fonksiyon içinde geçerli olup blok veya foksiyon
sonlandığında bellekten otomatik olarak atılan, yok edilen değişkenlerdir. Global değişkenler
ise ana program sonlanıncaya değin bellekte yer işgal etmeyi sürdürürler. Bu değişkenlerle
her hangi bir işlem yapılmasa dahi bellekten atılması mümkün değildir.
Bazen bellekten istediğimiz zaman istediğimiz kadar(ihtiyacımız kadar) yer alma ve işimiz
bittiğinde de aldığımız yerleri serbest bırakmak isteyebiliriz. Tabi ki burada yer alma ve
serbest bırakma işlemi program çalışıyorken(run time) gerçekleşmektedir. Belleğin bu şekilde
kullanılması dinamik bellek kullanımı olarak tanımlanır.
C dilinde bellekte yer alma için malloc( ), ayrılan yeri geri vermek için free( )
fonksiyonları kullanılmaktadır. C++ da ise dinamik bellek işlemlerini gerçekleştirmek için
daha çok yeteneğe sahip new ve delete komutları kullanılır. new bellek ten yer almak için,
delete ise alınan yerleri geri vermek için kullanılır. Aşağıda verilen örneği inceleyiniz.
int *p;
p=new int; //Tamasayı bir değer için bellekten yer al
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
20
BLM225
Nesneye Dayalı Programlama
21
*p=100; //Ayrılan yerin(adresin) içine 100 değeri at
delete p; //ayrılan yeri serbest bırak.(geri ver)
Örnekler:
float *p;
p=new float;
*p=3.14;
delete p;
int *p=new int; ifadesi aşağıdaki iki satırın yerine geçer.
int *p;
p=new int;
int *p=new int(100); ifadesi aşağıdaki üç satırın yerine geçer. Adres alındıktan sonra içine
başlangıç değeri olarak 100 değeri atılmaktadır.
int *p
p=new int;
*p=100;
Dinami bellek kullanımı ile ilgili olarak:
int *p=new int[10]; ifadesi 10 elemanlı int türünden bir dizi için bellekte yer ayırmakta ve
başlangıç adresini p ye atamaktadır.
Dizi elemanlarına sanki normal bir diziyi kullanıyormuşçasına p[0]=5; p[1]=2; şeklinde
erişmek mümkün olmaktadır.
Daha sonra bu dizi için ayrılan yeri
delete [ ] p;
ifadesi ile geri vermek mümkün olmaktadır. Bu ifadede dizi sembolü [ ] kullanımına dikkat
ediniz.
Verilen örnek programda klavyeden istenen değer kadar yer ayrılmakta ve girilen değerler
ekrana yazdırılmaktadır.
int main ()
{
int i;
int * p;
p= new int[2];
for (i=0; i<2; i++)
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
21
BLM225
Nesneye Dayalı Programlama
22
{
cout << "Sayi giriniz :";
cin >> p[i];
}
cout << "Girilen sayilar"<<endl;
for (i=0; i<2; i++)
{
cout << p[i] <<endl;
}
delete[] p;
cout << p[0] <<endl;
getch();
return 0;
}
#include <iostream>
using namespace std;
int main ()
{
int i,n;
int * p;
cout << "Kac sayi gireceksiniz ? ";
cin >> i;
p= new int[i];
if (p == 0)
cout << "Hata: bellekten yer alınamadı";
else
{
for (n=0; n<i; n++)
{
cout << "Sayi gir: ";
cin >> p[n];
}
cout << "Girdiginiz sayilar: ";
for (n=0; n<i; n++) cout << p[n] <<", "; //for döngüsü içinde sadece cout var.
delete[] p; //bu komut for dongusune dahil değil
}
return 0;
}
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
22
BLM225
Nesneye Dayalı Programlama
23
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
23

More Related Content

What's hot

4. nesneler ve sınıflar
4. nesneler ve sınıflar4. nesneler ve sınıflar
4. nesneler ve sınıflarkarmuhtam
 
6. this işaretçisi ve arkadaşlık
6. this işaretçisi ve arkadaşlık6. this işaretçisi ve arkadaşlık
6. this işaretçisi ve arkadaşlıkkarmuhtam
 
7. kalıtım
7. kalıtım7. kalıtım
7. kalıtımkarmuhtam
 
Ileri seviye javascript by Azer Koculu
Ileri seviye javascript by Azer KoculuIleri seviye javascript by Azer Koculu
Ileri seviye javascript by Azer Koculumustafa sarac
 
C#, Microsoft Yaz Okulu 2011 - İzmir
C#, Microsoft Yaz Okulu 2011 - İzmirC#, Microsoft Yaz Okulu 2011 - İzmir
C#, Microsoft Yaz Okulu 2011 - İzmirEnterprisecoding
 

What's hot (8)

4. yapılar
4. yapılar4. yapılar
4. yapılar
 
4. nesneler ve sınıflar
4. nesneler ve sınıflar4. nesneler ve sınıflar
4. nesneler ve sınıflar
 
6. this işaretçisi ve arkadaşlık
6. this işaretçisi ve arkadaşlık6. this işaretçisi ve arkadaşlık
6. this işaretçisi ve arkadaşlık
 
7. kalıtım
7. kalıtım7. kalıtım
7. kalıtım
 
C programlama
C programlamaC programlama
C programlama
 
Ileri seviye javascript by Azer Koculu
Ileri seviye javascript by Azer KoculuIleri seviye javascript by Azer Koculu
Ileri seviye javascript by Azer Koculu
 
C#, Microsoft Yaz Okulu 2011 - İzmir
C#, Microsoft Yaz Okulu 2011 - İzmirC#, Microsoft Yaz Okulu 2011 - İzmir
C#, Microsoft Yaz Okulu 2011 - İzmir
 
Php mysql sunum
Php mysql sunumPhp mysql sunum
Php mysql sunum
 

Similar to 3. aşırı yükleme yaşam alanı - dinamik bellek kullanımı

C++ egitimi-arnavutkoy
C++ egitimi-arnavutkoyC++ egitimi-arnavutkoy
C++ egitimi-arnavutkoysersld29
 
Mutant Web Applications
Mutant Web ApplicationsMutant Web Applications
Mutant Web Applicationsguest096801
 
C++ egitimi-kucukcekmece
C++ egitimi-kucukcekmeceC++ egitimi-kucukcekmece
C++ egitimi-kucukcekmecesersld29
 
C++ egitimi-sultangazi
C++ egitimi-sultangaziC++ egitimi-sultangazi
C++ egitimi-sultangazisersld29
 
C++ egitimi-cekmekoy
C++ egitimi-cekmekoyC++ egitimi-cekmekoy
C++ egitimi-cekmekoysersld29
 
Emrah KAHRAMAN - Java RMI
Emrah KAHRAMAN - Java RMI Emrah KAHRAMAN - Java RMI
Emrah KAHRAMAN - Java RMI Emrah Kahraman
 
C++ egitimi-kagithane
C++ egitimi-kagithaneC++ egitimi-kagithane
C++ egitimi-kagithanesersld29
 
C++ egitimi-buyukcekmece
C++ egitimi-buyukcekmeceC++ egitimi-buyukcekmece
C++ egitimi-buyukcekmecesersld29
 
C++ egitimi-sultanbeyli
C++ egitimi-sultanbeyliC++ egitimi-sultanbeyli
C++ egitimi-sultanbeylisersld29
 
C++ egitimi-gungoren
C++ egitimi-gungorenC++ egitimi-gungoren
C++ egitimi-gungorensersld29
 
C++ egitimi-atasehir
C++ egitimi-atasehirC++ egitimi-atasehir
C++ egitimi-atasehirsersld29
 
C++ egitimi-sancaktepe
C++ egitimi-sancaktepeC++ egitimi-sancaktepe
C++ egitimi-sancaktepesersld29
 
C++ egitimi-gaziosmanpasa
C++ egitimi-gaziosmanpasaC++ egitimi-gaziosmanpasa
C++ egitimi-gaziosmanpasasersld29
 
C++ egitimi-basaksehir
C++ egitimi-basaksehirC++ egitimi-basaksehir
C++ egitimi-basaksehirsersld29
 
C++ egitimi-ucretleri
C++ egitimi-ucretleriC++ egitimi-ucretleri
C++ egitimi-ucretlerisersld29
 
C++ egitimi-ankara
C++ egitimi-ankaraC++ egitimi-ankara
C++ egitimi-ankarasersld29
 
C++ egitimi-esenyurt
C++ egitimi-esenyurtC++ egitimi-esenyurt
C++ egitimi-esenyurtsersld29
 
C++ egitimi-beylikduzu
C++ egitimi-beylikduzuC++ egitimi-beylikduzu
C++ egitimi-beylikduzusersld29
 

Similar to 3. aşırı yükleme yaşam alanı - dinamik bellek kullanımı (20)

C++ egitimi-arnavutkoy
C++ egitimi-arnavutkoyC++ egitimi-arnavutkoy
C++ egitimi-arnavutkoy
 
Mutant Web Applications
Mutant Web ApplicationsMutant Web Applications
Mutant Web Applications
 
C++ egitimi-kucukcekmece
C++ egitimi-kucukcekmeceC++ egitimi-kucukcekmece
C++ egitimi-kucukcekmece
 
C++ egitimi-sultangazi
C++ egitimi-sultangaziC++ egitimi-sultangazi
C++ egitimi-sultangazi
 
C++ egitimi-cekmekoy
C++ egitimi-cekmekoyC++ egitimi-cekmekoy
C++ egitimi-cekmekoy
 
Emrah KAHRAMAN - Java RMI
Emrah KAHRAMAN - Java RMI Emrah KAHRAMAN - Java RMI
Emrah KAHRAMAN - Java RMI
 
C++ egitimi-kagithane
C++ egitimi-kagithaneC++ egitimi-kagithane
C++ egitimi-kagithane
 
C++ egitimi-buyukcekmece
C++ egitimi-buyukcekmeceC++ egitimi-buyukcekmece
C++ egitimi-buyukcekmece
 
C++ egitimi-sultanbeyli
C++ egitimi-sultanbeyliC++ egitimi-sultanbeyli
C++ egitimi-sultanbeyli
 
C++ egitimi-gungoren
C++ egitimi-gungorenC++ egitimi-gungoren
C++ egitimi-gungoren
 
C++ egitimi-atasehir
C++ egitimi-atasehirC++ egitimi-atasehir
C++ egitimi-atasehir
 
Spring Framework
Spring FrameworkSpring Framework
Spring Framework
 
C++ egitimi-sancaktepe
C++ egitimi-sancaktepeC++ egitimi-sancaktepe
C++ egitimi-sancaktepe
 
C++ egitimi-gaziosmanpasa
C++ egitimi-gaziosmanpasaC++ egitimi-gaziosmanpasa
C++ egitimi-gaziosmanpasa
 
C++ egitimi-basaksehir
C++ egitimi-basaksehirC++ egitimi-basaksehir
C++ egitimi-basaksehir
 
C++ egitimi-ucretleri
C++ egitimi-ucretleriC++ egitimi-ucretleri
C++ egitimi-ucretleri
 
C++ egitimi-ankara
C++ egitimi-ankaraC++ egitimi-ankara
C++ egitimi-ankara
 
Sqlmap Analiz
Sqlmap AnalizSqlmap Analiz
Sqlmap Analiz
 
C++ egitimi-esenyurt
C++ egitimi-esenyurtC++ egitimi-esenyurt
C++ egitimi-esenyurt
 
C++ egitimi-beylikduzu
C++ egitimi-beylikduzuC++ egitimi-beylikduzu
C++ egitimi-beylikduzu
 

More from karmuhtam

Devre analizi deney malzeme listesi
Devre analizi deney malzeme listesiDevre analizi deney malzeme listesi
Devre analizi deney malzeme listesikarmuhtam
 
Deney 3 ve 4
Deney 3 ve 4Deney 3 ve 4
Deney 3 ve 4karmuhtam
 
Deney 1 ve 2
Deney 1 ve 2Deney 1 ve 2
Deney 1 ve 2karmuhtam
 
Data structure week y 5 1
Data structure week y 5 1Data structure week y 5 1
Data structure week y 5 1karmuhtam
 
Data structure week y 5
Data structure week y 5Data structure week y 5
Data structure week y 5karmuhtam
 
Data structure week y 4
Data structure week y 4Data structure week y 4
Data structure week y 4karmuhtam
 
Data structure week 3
Data structure week 3Data structure week 3
Data structure week 3karmuhtam
 
Data structure week 2
Data structure week 2Data structure week 2
Data structure week 2karmuhtam
 
Data structure week 1
Data structure week 1Data structure week 1
Data structure week 1karmuhtam
 
12. stl örnekler
12.  stl örnekler12.  stl örnekler
12. stl örneklerkarmuhtam
 
Devre analizi defter
Devre analizi defterDevre analizi defter
Devre analizi defterkarmuhtam
 
H8 blm221 multiplexer-decoder-bellekler
H8 blm221 multiplexer-decoder-belleklerH8 blm221 multiplexer-decoder-bellekler
H8 blm221 multiplexer-decoder-belleklerkarmuhtam
 
H8 blm221 (1)
H8 blm221 (1)H8 blm221 (1)
H8 blm221 (1)karmuhtam
 

More from karmuhtam (18)

Devre analizi deney malzeme listesi
Devre analizi deney malzeme listesiDevre analizi deney malzeme listesi
Devre analizi deney malzeme listesi
 
Deney 6
Deney 6Deney 6
Deney 6
 
Deney 5
Deney 5Deney 5
Deney 5
 
Deney 3 ve 4
Deney 3 ve 4Deney 3 ve 4
Deney 3 ve 4
 
Deney 1 ve 2
Deney 1 ve 2Deney 1 ve 2
Deney 1 ve 2
 
Data structure week y 5 1
Data structure week y 5 1Data structure week y 5 1
Data structure week y 5 1
 
Data structure week y 5
Data structure week y 5Data structure week y 5
Data structure week y 5
 
Data structure week y 4
Data structure week y 4Data structure week y 4
Data structure week y 4
 
Data structure week 3
Data structure week 3Data structure week 3
Data structure week 3
 
Data structure week 2
Data structure week 2Data structure week 2
Data structure week 2
 
Data structure week 1
Data structure week 1Data structure week 1
Data structure week 1
 
12. stl örnekler
12.  stl örnekler12.  stl örnekler
12. stl örnekler
 
Devre analizi defter
Devre analizi defterDevre analizi defter
Devre analizi defter
 
H12 blm221
H12 blm221H12 blm221
H12 blm221
 
H11 blm221
H11 blm221H11 blm221
H11 blm221
 
H9 blm221
H9 blm221H9 blm221
H9 blm221
 
H8 blm221 multiplexer-decoder-bellekler
H8 blm221 multiplexer-decoder-belleklerH8 blm221 multiplexer-decoder-bellekler
H8 blm221 multiplexer-decoder-bellekler
 
H8 blm221 (1)
H8 blm221 (1)H8 blm221 (1)
H8 blm221 (1)
 

3. aşırı yükleme yaşam alanı - dinamik bellek kullanımı

  • 1. KBUZEM Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi 3. HAFTA NESNEYE DAYALI PROGRAMLAMA
  • 2. BLM225 Nesneye Dayalı Programlama 2 3. Fonksiyonların Aşırı Yüklenmesi( Function overloading) ve çok biçimlilik C++ da isimleri aynı yaptıkları işler farklı fonksiyonlar yazılabilir. Buna göre iki farklı fonksiyon, parametrelerinin tipleri, sayıları veya sıraları farklı olmak koşulu ile aynı isme sahip olabilirler. Derleyici hangi fonksiyonun çağrıldığını parametre listesine bakarak karar verir. Aynı isimde birden fazla fonksiyonun tanımlanmasına fonksiyonların aşırı yüklenmesi (function overloading) denir. Aşırı yüklenmiş fonksiyonlar, birbiriyle alakalı işlemlerin aynı adla çağrılmasına izin vererek programın karmaşıklığını azaltabilirler. Çok biçimlilik (polimorfizm), genel anlamda bir adın, birbirleriyle ilişkili fakat teknik açıdan farklı iki veya daha fazla amaç için kullanılabilmesi yeteneğidir. C++'da çok biçimlilik özelliği, fonksiyonlara yeni görev yükleme veya bir başka değişle fonksiyonlara aşırı yükleme (function overloading) ile sağlanabilir. Aşağıdaki programı inceleyiniz. #include <conio.h> #include <iostream.h> #include <iostream> #include <string> #include <list> using namespace std; void print() { cout<<"printed"<<endl; } void print(char c, int a) { for(int i=0; i<a;i++) { cout<<c<<endl; } } int main() { print(); print('a', 6); getch(); return 0; } Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE 2
  • 3. BLM225 Nesneye Dayalı Programlama 3 #include <iostream> using namespace std; void yaz(); //Bildirimler void yaz(char); void yaz(char, int); int main() { yaz(); yaz('='); yaz('+', 30); cin.get(); return 0; } //-------------------------------------------------------------- // 45 defa * yazar void yaz() { for(int j=0; j<45; j++) // herzaman 45 kez döner cout << '*'; cout << endl; } //-------------------------------------------------------------- // belirtilen karakteri 45 kez yazar void yaz(char ch) { for(int j=0; j<45; j++) cout << ch; cout << endl; } //-------------------------------------------------------------- // Belirtilen karakteri n kez yazar void yaz(char ch, int n) { for(int j=0; j<n; j++) // n defa döner cout << ch; cout << endl; } Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE 3
  • 4. BLM225 Nesneye Dayalı Programlama 4 Operatörlerin Aşırı Yüklenmesi( Operator Overloading) C++'da, + , - , *, !, ++ gibi operatörlere fonksiyonlar yazarak bu operatörlere yeni işlevler yüklenebilir. Sadece C++'da zaten var olan operatörler aşırı yüklenebilir. Örneğin C++'da var olmayan '^' operatörü için üs almak üzere bir fonksiyon yazılamaz. Fonksiyonlar tanımlanırken operatörün orjinalinde var olan operand sayısı değiştirilemez. Örneğin '+' operatörü iki değişken değerini toplar. Değişken sayısı tek olamaz. Ayrıca daha önceki konularda geçtiği gibi operatörlerin öncelik sırası değiştirilemez. Bir 4, -, *, ! gibi bir işlem operatörlerine ‘operator’ sözcüğü ile yükleme yapılır. Örneğin toplama operatörü ‘+’ operatörüne “operator+” şeklinde isim verilerek yükleme yapılır. Operatrör aşırı yüklemesi aşağıda gösterildiği gibi yapılır. DönüşTipi operatorOperatörismi(parametre listesi) { // gerçekleştirilecek işlem } a 55 56 57 ekran 55 57 Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE 4
  • 5. BLM225 Nesneye Dayalı Programlama 5 #include <conio.h> #include <iostream.h> #include <iostream> using namespace std; struct Mat { int a,b; }; void goster( Mat m){ cout<<"a="<<m.a<<endl; cout<<"b="<<m.b<<endl; } Mat operator+(Mat mt1, Mat mt2) { Mat sonuc; sonuc.a=mt1.a + mt2.a; sonuc.b=mt1.b + mt2.b; return sonuc; } int main( ) { Mat sayi1; Mat sayi2; Mat toplam; sayi1.a=5; sayi1.b=4; sayi2.a=5; sayi2.b=4; toplam=sayi1+sayi2; cout<<"a="<<toplam.a<<endl; cout<<"b="<<toplam.b<<endl; Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE 5
  • 6. BLM225 Nesneye Dayalı Programlama 6 goster(toplam); getch(); return 0; } #include <conio.h> #include <iostream.h> #include <iostream> using namespace std; struct Mat { int a; int b; }; Mat operator+(Mat x, Mat y) { Mat sonuc; sonuc.a=x.a-y.a; sonuc.b=x.b-y.b; return sonuc; } int main () { int a,b; a=5; b=4; b=b+a; cout<<b<<endl; Mat m1,m2,m3; m1.a=6; m1.b=4; m2.a=3; m2.b=5; m3=m1+m2; cout<<m3.a<< "," <<m3.b<<endl; getch(); return 0; } Örnek olarak aşağıda verile programda ‘+’ operatörü iki karmaşık sayıyı toplamak için aşırı yüklenmektedir. Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE 6
  • 7. BLM225 Nesneye Dayalı Programlama 7 #include <conio.h> #include <iostream.h> #include <iostream> using namespace std; #include <iostream> struct KarmasikSayi{ // Karmaşık sayıları tanımlamak için bir yapı float reel,sanal; // Reel ve sanal kısımlar }; // + operatörünün karmaşık sayıları toplamak için yüklenmesi KarmasikSayi operator+ (const KarmasikSayi &v1, const KarmasikSayi &v2) { KarmasikSayi sonuc; // sonucun yazılacağı yerel değişken sonuc.reel=v1.reel+v2.reel; // reel kısımlar toplanıyor sonuc.sanal=v1.sanal+v2.sanal; // sanal kısımlar toplanıyor return sonuc; // sonuç çağıran programa döndürülüyor } void yaz (KarmasikSayi c){ //kompleks sayıları yazan print fonksiyonu cout<< "reel= " << c.reel << " sanal= " << c.sanal << endl; } int main() { int a,b; a=5; b=1; a=a+b; cout<<"a="<<a<<endl; KarmasikSayi c1,c2,c3; // Üç adet karmaşık sayı tanımlanıyor c1.reel= 3; c1.sanal= -1; c2.reel= 2.5; c2.sanal= 0.7; c3= c1 + c2; // Burada + iki karmaşık sayıyı topluyor yaz(c3); getch(); return 0; } Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE 7
  • 8. BLM225 Nesneye Dayalı Programlama 8 //prefix #include <conio.h> #include <iostream.h> #include <iostream> #include <string> #include <list> using namespace std; struct Mat{ int x; int y; }m1; void operator++(Mat m1) { Mat mr; mr.x=(m1.x)+1; mr.y=(m1.y)+1; cout<<mr.x<<","<<mr.y<<endl; } int main() { m1.x=5; m1.y=5; ++m1; m1.x++; cout<<m1.x<<endl; ++m1; getch(); return 0; } Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE 8
  • 9. BLM225 Nesneye Dayalı Programlama 9 //prefix #include <conio.h> #include <iostream.h> using namespace std; struct Mat{ int x; int y; void operator++() { x++; y++; cout<<x<<","<<y<<endl; } }m1; int main() { m1.x=5; m1.y=5; ++m1; m1.x++; cout<<m1.x<<endl; ++m1; getch(); return 0; } //postfix #include <conio.h> #include <iostream.h> using namespace std; struct Mat{ int x; int y; Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE 9
  • 10. BLM225 Nesneye Dayalı Programlama 10 void operator++(int) { x++; y++; cout<<x<<","<<y<<endl; } }m1; int main() { m1.x=5; m1.y=5; m1++; m1.x++; cout<<m1.x<<endl; m1++; getch(); return 0; } 4.1 Yaşam alanı (scope) Bir C++ programında global olarak tanımlanan bir değişkenle, yerel olarak tanımlanan bir değişken aynı isme sahip olabilir. Bu durumda yerel olarak tanımlanan değişken global olarak tanımlanan değişkene göre önceliğe sahiptir. Bir başka ifade ile en içte yer alan bloktaki değişken bir üsttekini örter. Yaşam alanı belirtme (scope Resolution)operatörü(::) kullanılarak örtülmüş olan verilere erişerek kullanmak mümkün olmaktadır. (::) operatörü kısaca kapsam (scope) operatörü olarak da ifade edilmektedir. Aşağıda verilen programı inceleyiniz. #include <conio.h> #include <iostream.h> #include <iostream> using namespace std; int a=6; int main( ) Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE 10
  • 11. BLM225 Nesneye Dayalı Programlama 11 { int a=5; cout<<"a="<<a<<endl; cout<<"a="<<::a<<endl; getch(); return 0; } #include <conio.h> #include <iostream> #include <list> using namespace std; int main () { int a=5; int i; for(i=0;i<3; i++) { a++; int k=1; } k++; // error getch(); return 0; } #include <conio.h> #include <iostream.h> #include <iostream> using namespace std; #include <iostream> int k = 10; //global k int main() { int k; //yerel k Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE 11
  • 12. BLM225 Nesneye Dayalı Programlama 12 for (k = 0; k < 5; ++k) { cout<< " yerel degisken " << k ; cout<< " Global degisken " << ::k <<endl; } ::k++; cout<<endl; cout<< " Donguden sonra n " ; cout<< " yerel degisken " << k ; cout<< " Global degisken " << ::k <<endl; getch(); return 0; } İsim uzayı (Name Space) Takım halinde bir yazılım geliştirmek için programcılar bir araya geldiklerinde, her programcı kendine ait bir takım değişkenler ve fonksiyonlar tanımlar. Programlar bir araya getirildiğinde ise aynı isimde birden fazla değişken ve fonksiyon tanımlaması ile karşılaşılabilir. Bu durumda isim çakışması meydana gelir. Bunu önlemek için C++ de her programcının kendine ait bir isim uzayı tanımlamasına imkân verilmiştir. #include <conio.h> #include <iostream.h> #include <iostream> using namespace std; namespace zafer { int a = 5; } namespace salih { int a = 6; } int main () { Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE 12
  • 13. BLM225 Nesneye Dayalı Programlama 13 cout <<"zafer hocanin a degiskeni="<<zafer::a << endl; cout <<"salih hocanin a degiskeni="<<salih::a << endl; getch(); return 0; } #include <conio.h> #include <iostream.h> #include <iostream> using namespace std; namespace zafer { int a = 15; } namespace salih { int a = 6; } using namespace zafer; //using namespace salih; hatalı satır int main () { cout<<a<<endl; cout <<"zafer hocanin a degiskeni="<<zafer::a << endl; cout <<"salih hocanin a degiskeni="<<salih::a << endl; getch(); return 0; } #include <conio.h> #include <iostream.h> #include <iostream> using namespace std; namespace zafer { int a = 5; int karesi(int a) { return a*a; } } Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE 13
  • 14. BLM225 Nesneye Dayalı Programlama 14 namespace salih { double a = 6; } int main () { cout <<"zafer hocanin a degiskeni="<<zafer::a << endl; cout <<"zafer hocanin a degiskeninin karesi="<<zafer::karesi(zafer::a) << endl; cout <<"salih hocanin a degiskeni="<<salih::a << endl; cout <<"salih hocanin a degiskeninin karesi="<<zafer::karesi(salih::a) << endl; getch(); return 0; } Her bir isim uzayındaki değişkenler sadece o isim uzayı içinde tanınırlar. Aşağıda verilen direktif, using namespace std; std isim uzayının kullanılacağını belirtir. cin, cout ve endl fonksiyonları gibi C++ standart kütüphanesinde yer alan tüm değişkenler ve fonksiyonlar bu isim uzayı içinde tanımlanmıştır. Bu direktifin verilmemesi halinde bu fonksiyonları kullanmak için başlarına std yazmak gerekir. Örnek: Std::cout<<”merhaba”<<endl; Std::cin>>x; İsim uzayı tanımlama Bir isim uzayı aşağıdaki şekilde tanımlanır. namespace tanımlayıcı { Değişkenler; } Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE 14
  • 15. BLM225 Nesneye Dayalı Programlama 15 Örnek: namespace isimuzayı1 { int a, b; } İsimuzayi1 de tanımlanan a ve b değişkenlerine erişmek için aşağıdaki şekilde kullanmak gerekmektedir. isimuzayi1::a=5; isimuzayi1::b=7; örnek #include <conio.h> #include <iostream.h> #include <iostream> using namespace std; namespace isimuzayi1 { int a = 5; } namespace isimuzayi2 { double a = 3.1416; } int main () { cout << isimuzayi1::a << endl; cout << isimuzayi2::a << endl; getch(); return 0; } #include <conio.h> #include <iostream.h> #include <iostream> using namespace std; namespace isimuzayi1 { int a = 5; } namespace isimuzayi2 Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE 15
  • 16. BLM225 Nesneye Dayalı Programlama 16 { double a = 3.1416; } using namespace isimuzayi1; int main () { cout << a << endl; cout << isimuzayi2::a << endl; getch(); return 0; } Using bildirimi Kullanımı kolaylaştırmak ve her değişkeni kullanırken değişken ismi önüne isim uzayı ismini yazmamak için using bildirimi kullanılır. Her bir değişken için using bildirimi ayrı ayrı olarak kullanılabileceği gibi, tüm isim uzayı için de kullanılabilir. #include <conio.h> #include <iostream.h> #include <iostream> using namespace std; namespace zafer { int a = 5; int karesi(int a) { return a*a; } } namespace salih { double a = 6; } int main () { using namespace zafer; cout <<"zafer hocanin a degiskeni="<<a << endl; getch(); Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE 16
  • 17. BLM225 Nesneye Dayalı Programlama 17 return 0; } #include <conio.h> #include <iostream.h> #include <iostream> using namespace std; #include <conio.h> #include <iostream.h> #include <iostream> using namespace std; namespace zafer { int a = 5; int karesi(int a) { return a*a; } } namespace salih { double a = 6.9; double yazdir(){ return a;} } int main () { using namespace zafer; cout <<"zafer hocanin a degiskeni="<<a << endl; cout <<"karesi "<<karesi(10) << endl; cout <<salih::yazdir()<<endl; getch(); return 0; } #include <iostream> using namespace std; namespace isimuzayi1 { int x = 5; int y = 10; Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE 17
  • 18. BLM225 Nesneye Dayalı Programlama 18 } namespace isimuzayi2 { double x = 3.1416; double y = 2.7183; } int main () { using isimuzayi1::x; using isimuzayi2::y; cout << x << endl; cout << y << endl; cout << isimuzayi1::y << endl; cout << isimuzayi2::x << endl; return 0; } Using bildirimi ile tüm isim uzayı bildirildikten sonra isim uzayı içinde tanımlanmış tüm değişkenleri kullanırken önünde isim uzayı ismini belirtmeye gerek kalmaz. Bu durumda using namespace olarak kullanılır. #include <iostream.h> #include <conio.h> using namespace std; namespace isimuzayi1 { int x = 5; int y = 10; } namespace isimuzayi2 { double x = 3.1416; double y = 2.7183; } int main () { using namespace isimuzayi1; cout << x << endl; cout << y << endl; Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE 18
  • 19. BLM225 Nesneye Dayalı Programlama 19 cout << isimuzayi2::y << endl; cout << isimuzayi2::x << endl; getch(); return 0; } İsimuzayı aşağıdaki gibi de kullanılabilir. #include <iostream> using namespace std; namespace isimuzayi1 { int x = 5; int y = 10; } namespace isimuzayi2 { double x = 3.1416; double y = 2.7183; } int main () { { using namespace isimuzayi1; cout << x << endl; cout << y << endl; } { using namespace isimuzayi2; cout << y << endl; cout << x << endl; } return 0; } #include <conio.h> #include <iostream.h> Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE 19
  • 20. BLM225 Nesneye Dayalı Programlama 20 #include <iostream> #include <string> #include <list> using namespace std; namespace p1 { int a=5,b=6,c=7; } namespace p2 { int a=1,b=2,c=3; } int main() { using p1::a; // int a=5; using p2::a; // int a=1; error a++; cout<<a<<endl; getch(); return 0; } 4.2. Dinamik bellek kullanımı Daha önceki derslerimizde yerel ve global değişkenlerden bahsedilmişti. Yerel değişkenler tanımlandıkları blok içinde veya fonksiyon içinde geçerli olup blok veya foksiyon sonlandığında bellekten otomatik olarak atılan, yok edilen değişkenlerdir. Global değişkenler ise ana program sonlanıncaya değin bellekte yer işgal etmeyi sürdürürler. Bu değişkenlerle her hangi bir işlem yapılmasa dahi bellekten atılması mümkün değildir. Bazen bellekten istediğimiz zaman istediğimiz kadar(ihtiyacımız kadar) yer alma ve işimiz bittiğinde de aldığımız yerleri serbest bırakmak isteyebiliriz. Tabi ki burada yer alma ve serbest bırakma işlemi program çalışıyorken(run time) gerçekleşmektedir. Belleğin bu şekilde kullanılması dinamik bellek kullanımı olarak tanımlanır. C dilinde bellekte yer alma için malloc( ), ayrılan yeri geri vermek için free( ) fonksiyonları kullanılmaktadır. C++ da ise dinamik bellek işlemlerini gerçekleştirmek için daha çok yeteneğe sahip new ve delete komutları kullanılır. new bellek ten yer almak için, delete ise alınan yerleri geri vermek için kullanılır. Aşağıda verilen örneği inceleyiniz. int *p; p=new int; //Tamasayı bir değer için bellekten yer al Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE 20
  • 21. BLM225 Nesneye Dayalı Programlama 21 *p=100; //Ayrılan yerin(adresin) içine 100 değeri at delete p; //ayrılan yeri serbest bırak.(geri ver) Örnekler: float *p; p=new float; *p=3.14; delete p; int *p=new int; ifadesi aşağıdaki iki satırın yerine geçer. int *p; p=new int; int *p=new int(100); ifadesi aşağıdaki üç satırın yerine geçer. Adres alındıktan sonra içine başlangıç değeri olarak 100 değeri atılmaktadır. int *p p=new int; *p=100; Dinami bellek kullanımı ile ilgili olarak: int *p=new int[10]; ifadesi 10 elemanlı int türünden bir dizi için bellekte yer ayırmakta ve başlangıç adresini p ye atamaktadır. Dizi elemanlarına sanki normal bir diziyi kullanıyormuşçasına p[0]=5; p[1]=2; şeklinde erişmek mümkün olmaktadır. Daha sonra bu dizi için ayrılan yeri delete [ ] p; ifadesi ile geri vermek mümkün olmaktadır. Bu ifadede dizi sembolü [ ] kullanımına dikkat ediniz. Verilen örnek programda klavyeden istenen değer kadar yer ayrılmakta ve girilen değerler ekrana yazdırılmaktadır. int main () { int i; int * p; p= new int[2]; for (i=0; i<2; i++) Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE 21
  • 22. BLM225 Nesneye Dayalı Programlama 22 { cout << "Sayi giriniz :"; cin >> p[i]; } cout << "Girilen sayilar"<<endl; for (i=0; i<2; i++) { cout << p[i] <<endl; } delete[] p; cout << p[0] <<endl; getch(); return 0; } #include <iostream> using namespace std; int main () { int i,n; int * p; cout << "Kac sayi gireceksiniz ? "; cin >> i; p= new int[i]; if (p == 0) cout << "Hata: bellekten yer alınamadı"; else { for (n=0; n<i; n++) { cout << "Sayi gir: "; cin >> p[n]; } cout << "Girdiginiz sayilar: "; for (n=0; n<i; n++) cout << p[n] <<", "; //for döngüsü içinde sadece cout var. delete[] p; //bu komut for dongusune dahil değil } return 0; } Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE 22
  • 23. BLM225 Nesneye Dayalı Programlama 23 Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE 23