Kategoriler
C/C++

C++ Hızlı Başlangıç Rehberi

Daha önce Ubuntu üzerinde C/C++ için geliştirme ortamının nasıl kurulacağı ile ilgili anlatım yaptığım bir içerik paylaşmıştım. Buradan o içeriğe ulaşabilirsiniz. Bu sefer farklı bir yazılım diline hakim olarak geliştirme yapabilen ancak C++ hakkında bir fikri olmayan arkadaşlar için bir hızlı başlangıç rehberi yazmaya karar verdim.

Bu içerik de sadece bir kaç basit örnek ile C++ söz dizimine (syntax) değinerek en azında bir cpp dosyasını açtığınızda anlayabilir duruma gelmenizi amaçlıyorum. “Bu değişken dedikleri neye benziyor?, Fonksiyon dediğin yenir mi?, OOP mi o da ne?” kıvamındaysanız bu içerik kesinlikle size göre değildir. Ayrıca bir çok şeyi de burada detaylandırmak mümkün olmayacaktır. Bu yüzden ileride bazı konular üzerinde detaylandırılmış içerikler paylaşmayı planlıyorum.

Başlamadan önce olabildiğince basit şekilde C++ ile ilgili bir kaç madde de söyleyelim.

  • C++ bilgisayarın temelini oluşturan C dilinin bir üst dilidir. Yani tüm C kodları aynı zamanda C++ koddudur.
  • C ile arasındaki en önemli fark C++‘ın nesne yönelimli olmasıdır.
  • .cpp” uzantılı dosyalarda yazılır.
  • Çalıştırılması/yürütülmesi için önceden derlenmiş olması gerekir.
  • Orta seviyeli programlama dilleri arasındadır.
  • C++ ile yazılan program yukarıdan aşağı, soldan sağa okunur ve çalıştırılır.

Noktalı virgül “;” ve Bloklar “{}

C++ da noktalı virgüller ifade/satır sonlandırıcı olarak kullanılır.

int x = 5;
int y;
y = x;
cout<<x + y;

ile

int x = 5; int y; y=x; cout<<x + y;

arasında bir fark yoktur.

C++ da süslü parantez olarak bildiğimiz “{“, “}” sembolleri blokları belirtmek için kullanılır. Bu blokları kodların çalıştığı odalar/gözler olarak düşünebilirsiniz.

{
int x = 5;
int y = 2;
}

Yorum tek satır;

// Burada yazdıklarım derlenmeyecektir.

benzer şekilde çoklu satır yorumları da aşağıdaki şekilde yazabilirsiniz.

/*
Burada yazdıklarımda derleyici tarafından göz ardı edilir.
Unutmayın, iyi yorumlanış bir kod her zaman daha iyidir.
*/

Kütüphanelerin dahil edilmesi “#include” ile yapılır.

#include <stdio.h>
#include <iostream>

Sistem tarafından sunulan kütüphaneler “<” ve “>” sembolleri arasında yazılır.

Kendi yazdığınız kütüphaneyi dahil etmek için ‘"‘ kullanılır.

#include "mylibrary.h"

Çıktı alma işlemleri iostream kütüphanesinin std ad alanı ile gerçekleştirilir.

Çıktı alma cout ile yapılır.

cout<<"Hello World";

Alt satıra geçmek için endl kullanılır.

cout<<"Hello World"<<endl;

Çoklu kullanım örneği;

cout<<"Hello"<<" "<<"World"<<endl;

C++ da kullanıcıdan veri yani girdi almak için yine iostream kütüphanesinin std ad alanı gereklidir.

Girdi (Input) alma cin ile yapılır.

int veri;
cin>>veri;

yukarıdaki örnekte veri adında bir değişken oluşturup, kullanıcıdan “veri” değişkeni için bir değer istedik.

Çoklu Girdi (Multi Input)

int veri1, veri2, veri3;
cin>>veri1>>veri2>>veri3;

String Girdisi Alma

cin kullanımında kullanıcıdan veri alırken şöyle bir sorun oluşabilir. iostream kütüphanesinin cin işlemcisi boşlukları aldığı verileri bölmek için kullanır.

string adiniz;
cin>>adiniz;

Kullanıcı bu bölüme adını boşluklu olarak;

Muhammet Şafak

olarak girerse C++ “adiniz” değişkenine “Muhammet” kelimesini atayacaktır.

Bu yüzden kullanıcıdan string bir değer alırken string kütüphanesinin getline() fonksiyonu kullanılmalıdır.

string adiniz;
getline(cin, adiniz);

C++ da ekrana “Hello World” yazdıracak basit bir program şu şekilde görünür.

#include <iostream>
using namespace std;
int main(){
    cout<<"Hello World"<<endl;
    return 0;
}

Veri Türleri

int

Integer : Tamsayı
Bellek : 2byte
Bir tamsayıyı ifade eder.

string

Metin değerini ifade eder.

char

Bir karakteri ifade eder.

float

Float : Ondalıklı Sayı
Bellek : 4byte
Hassasiyet : 7-8 basamak
Ondalıklı sayıyı ifade eder.

double

Double : Ondalıklı Sayı
Bellek : 8byte
Hassasiyet : 15-16 basamak
Ondalıklı sayıyı ifade eder.

bool

Bool : Boolean Değer
true ya da false değerini alır.


Değişkenler

Bilinmesi gerekenler;

  • Değişken adı sayısal bir değer ile başlayamaz ancak sayısal bir değer içerebilir.
  • Değişken adı boşluk içeremez.
  • Değişken adı “_” dışında sembol içeremez.
  • İçereceği veri türü belirtilmelidir.
int bir_tamsayi = 15;
string bir_metin = "Bu bir metin olarak işlenir.";
float ondalik_sayi = 3.14;
double hassasOndalik_sayi = 3.141592653;
bool durum = true;

Tanımlama yapıldıktan sonra değer ataması da yapılabilir. Örneğin;

int bir_tamsayiDegiskeni;
bir_tamsayiDegiskeni = 13;
Statik Değişken;

static ile tanımlanır.

static int statik_bir_degisken = 12;

Bloklar

{“, “}” sembolleri arasındaki kodları ifade etmek için kullanılan terimdir.

{
    //kod blogu
}

Temel Matematik İşlemleri

4 işlem olarak ifade edilen toplama, çıkarma, çarpma ve bölme işlemleri sırasıyla “+“, ““, “*“, “/” sembolleri ile yapılır.

Toplama İşlemi örneği;

int x = 15;
int y = 3;
int sonuc = x + y;

Çıkarma İşlemi örneği;

int x = 15;
int y = 3;
int sonuc = x - y;

Çarpma İşlemi örneği;

int x = 15;
int y = 3;
int sonuc = x * y;

Bölme İşlemi örneği;

int x = 15;
int y = 3;
int sonuc = x / y;

Mod alma işlemi “%” ile yapılır.

int x = 13;
int y = 2;
int mod_al = x % y;

Koşul Operatörleri

Koşullu operatörler tüm yazılım dillerinde olduğu gibi sağına ve soluna gelen değerlerin birbirine göre durumlarını sorgular. Başarı durumu true başarısızlık durumu false olur.

==

Değerlerin birbirine eşitliğini sorgular.

!=

Değerlerin farklı olmasını sorgular.

<

Solundaki değerin sağındaki değerden küçük olma durumunu sorgular.

>

Solundaki değerin sağındaki değerden büyük olma durumunu sorgular.

<=

Solundaki değerin sağındaki değerden küçük veya eşit olma durumunu sorgular.

>=

Solundaki değerin sağındaki değerden büyük veya eşit olma durumunu sorgular.


Koşullu İfadeler

İf/Else Yapısı;

int x = 5;
int y = 3;

if(x < y){
    //Koşul başarılı ise burası çalışır.
}else{
    //Koşul başarısız ise burası çalışır.
}

İf/Elseif/Else Yapısı

int x = 5;
int y = 5;

if(x == y){
    //Bu koşul başarılı ise burası çalışır.
}else if(x < y){
    //Bu koşul başarılı ise burası çalışır.
}else{
    //Koşul başarısız ise burası çalışır.
}

Switch/Case Yapısı

int x = 5;

switch(x){
    case 3 :
        cout<<"x değişkeni 3tür."<<endl;
        break;
    case 4 :
        cout<<"x değişkeni 4tür."<<endl;
        break;
    default :
        cout<<"Bir eşleşme gerçekleşmedi!"<<endl;
        break;
}

Diziler

Diziler “{“, “}” sembolleri arasında tanımlanır. Dizinin her elamanı “,” ile ayrılır. Değişken adı sonunda “[“, “]” sembolleri içinde dizinin kaç elmanı olduğu bildirilir.

string kis_meyveler[3] = {"portakal", "mandalina", "nar"};
int rakamlar[10] = {0,1,2,3,4,5,6,7,8,9};

İç içe diziler;

int sayi_dizisi[3][4] = {{1,3,5,7}, {2,4,6,8}, {10,11,12,13}};

Döngüler

For Döngüsü

for(int i = 0; i <= 9; i++){
    cout<<i<<endl;
}

While Döngüsü

int i = 0;
while(i < 10){
    cout<<i<<endl;
    i++;
}

Do/While Döngüsü

int i = 0;
do{
   cout<<i<<endl;
}while(i != 0);

break

break; ifadesi döngü içerisinde döngüyü sonlandırmak için kullanılan ifadedir.

for(int i = 0; i < 10; i++){
    if(i == 5){
        break;
    }
    cout<<i<<endl;
}

continue

continue; ifadesi döngü içerisinde kendisinden sonra gelen kodları döngü sonuna kadar görmezden gelerek döngüyü devam ettirir.

for(int i = 0; i < 10; i++){
    if(i == 5){
        continue;
    }
    cout<<i<<endl;
}

Pekiştirme Amaçlı Çarpım Tablosu örneği;

for(int x = 1; x <= 10; x++){
     cout<<x<<" çarpım tablosu"<<endl;
     for(int y = 1; y <= 10; y++){
         cout << x << " * " << y << " = " << x*y << endl;
     }
 }

Fonksiyon

  • Fonksiyon isimleri _ dışında bir sembol içeremez.
  • Fonksiyon isimleri rakamla başlayamaz.

No-Return Fonksiyonlar;

Fonksiyon bir şey return etmeyecekse yani döndürmeyecek ise void kelimesi ile tanımlanır.

void hello(){
    cout<<"Hello World!"<<endl;
}

Return Fonksiyonlar;

Fonksiyonun döndürdüğü veri türünün adı ile tanımlanmalıdır. Örneğin;

string selam_ver(){
    return "Selam";
}
int topla(){
    int x = 3;
    int y = 4;
    return x + y;
}

Parametre Alma

Fonksiyon eğer parametre alacaksa fonksiyon adından sonra gelen “(“, “)” sembolleri arasında “,” ile ayrılarak verilmelidir.

void echo(string message){
    cout<<message<<endl;
}
int carpma(int x, int y){
    return x*y;
}

Fonksiyonlarda Aşırı Yükleme (Overloading)

Bir fonksiyonun birden fazla kullanım şekli olabilir. Örneğin bazı durumlarda aldığı parametre tam sayı ya da ondalıklı sayı olabilir. Bu durumlar için fonksiyonun kullanım şekilleri tek tek tanımlanır.

int bolme(int x, int y){
    return x/y;
}

double bolme(double x, double y){
    return x/y;
}

Bellek Adresini Öğrenme

Bir değişkenin bellekteki adresini öğrenmek için değişken adının başına “&” sembolü kullanılır.

int i = 15;
cout << &i << endl;

Bu örnek 0x7ffe08df3a70 benzeri bir adres bastıracaktır.

Dizilerde ise dizinin ilk elemanının adresi istenir.

int dizi[] = {1,2,3,4,5,6,7,8,9};
cout << &dizi[0] << endl;

Pointers (İşaretçiler)

*” sembolü ile tanımlanır. Bir değişkenin bellekte tutulduğu adresi işaret eder.

int degisken = 1992;
int *degisken_nerede = &degisken;

cout << degisken << endl;
cout << degisken_nerede << endl;
cout << *degisken_nerede << endl;

Yukarıdaki örneğin çıktısı aşağıdakine benzer olacaktır;

1992
0x7ffe08df3a74
1992

Fonksiyonlarla basit bir kullanım örneği;

void degeri_degistir(int *adres, int yeni_deger){
    *adres = yeni_deger;
}

int main(){
    int sayi = 45;
    cout << "Sayı : " << sayi << endl;
    degeri_degistir(&sayi, 60);
    cout << "Sayı : " << sayi << endl;
}

Define (Tanımlar)

#define ile tanımlanır.

#define TANIM_ADI "Bu string bir sabittir"
#define TAM_SAYI 15

Bir define sabitini kaldırmak/silmek için #undef kullanılıyor.

#undef TANIM_ADI

Const (Sabitler)

Program boyunca ulaşabileceğiniz ancak değerini değiştiremeyeceğiniz değerlerdir. const ile tanımlanır.

const int sayi = 5;

Referanslar

Referanslar kendisine atanan değişkenin bellekteki adresini alır. Başına “&” sembolü alarak tanımlanır.

int degisken = 45;
int &referans_adi = degisken;

Fonksiyon ile birlikte kullanım örneği;

void degeri_degistir(int &degisken, int yeni_deger){
    degisken = yeni_deger;
}

int main(){
    int sayi = 45;
    cout << "Sayı : " << sayi << endl;
    degeri_degistir(sayi, 60);
    cout << "Sayı : " << sayi << endl;
}

Bellek Yönetimi

Bir değişkenin bellekte kapladığı alan miktarını (byte cinsinden) öğrenmek için sizeof() fonksiyonu kullanılır.

int i = 13;
cout<<sizeof(i)<<endl;

Bir işaretçiyi bellekten silmek için delete kullanılır tanımlanır. Kendisinden sonra gelen bellek adresini boşaltır/siler.

int degisken_adi = 25;
cout<<degisken_adi<<endl;
delete &degisken_adi;

Bir pointer (işaretçi) silmek istiyorsanız aşağıdaki örnekteki gibi kullanabilirsiniz. delete işleminden sonra pointer değişkenine nullptr atanmalıdır.

int degisken_adi = 25;
int *degisken_adresi = &degisken_adi;
delete degisken_adresi;
degisken_adresi = nullptr;

Structures (Yapılar)

Yapılar; içerisinde özellikler barındıran şemalardır. struct ile tanımlanırlar.

struct Tatlilar{
    int id;
    string name;
    string description;
    float price;
};

int main(){
    Tatlilar tulumba = {1, "Tulumba", "Hamurun kızartılıp şerbetlenmesi ile yapılmış bir tatlıdır.", 12.5};
    cout << tulumba.name << " " << tulumba.price << " TL" << endl;
    return 0;
}

Struct – Pointer

struct Tatlilar{
    int id;
    string name;
    string description;
    float price;
};

void fiyatDegistir(Tatlilar* tatli, float yeni_fiyat){
    tatli->price = yeni_fiyat;
}

int main(){
    Tatlilar tulumba = {1, "Tulumba", "Hamurun kızartılıp şerbetlenmesi ile yapılmış bir tatlıdır.", 12.5};
    cout << tulumba.name << " " << tulumba.price << endl;
    fiyatDegistir(&tulumba, 14.5);
    cout << tulumba.name << " " << tulumba.price << endl;
    return 0;
}

Struct in Struct – Pointer

struct Urun{
    string adi;
    int stok;
    float fiyat;
};

struct Reyon{
    string adi;
    int stok;
    Urun urun;
};

void satis(Reyon* reyon, int adet)
{
    reyon->urun.stok -= adet;
    reyon->stok -= adet;
}

int main(){
    Reyon parfum = {"Parfüm", 100, {"Erkek Parfümü", 50, 15.5}};

    cout<<parfum.adi<<" reyonunda toplam "<<parfum.stok<< " adet ürün bulunuyor."<<endl;
    cout<<"\t"<<parfum.urun.adi<<" ürününden tanesi "<<parfum.urun.fiyat<<" TLden "<<parfum.urun.stok<<" adet bulunuyor..."<<endl;
    satis(&parfum, 5);
    cout<<parfum.adi<<" reyonunda toplam "<<parfum.stok<< " adet ürün bulunuyor."<<endl;
    cout<<"\t"<<parfum.urun.adi<<" ürününden tanesi "<<parfum.urun.fiyat<<" TLden "<<parfum.urun.stok<<" adet bulunuyor..."<<endl;
    return 0;
}

Bu örneği biraz daha detaylandırıp hesap kitap işlerini de yapabilen basit bir betik yazalım.

struct Urun{
    string adi;
    int stok;
    float fiyat;
};

struct Reyon{
    string adi;
    int stok;
    Urun urun;
};

struct Kasa{
    float total;
};

void satis(Reyon* reyon, int adet, Kasa* kasa)
{
    cout<< reyon->adi << " reyonundan " << adet << " adet " << reyon->urun.adi << " satiliyor..." <<endl;
    reyon->urun.stok -= adet;
    reyon->stok -= adet;
    float kasa_ekle = adet * (float)reyon->urun.fiyat;
    cout << "Kasaya " << kasa_ekle << " tl ekleniyor..." << endl;
    kasa->total += kasa_ekle;
    cout << reyon->urun.adi << " ürününden " << reyon->urun.stok << " kaldı." << endl;
    cout << "Yeni Kasa : " << kasa->total << " TL" << endl;
}

int main(){
    Kasa kasa = {0.0};
    Reyon parfum = {"Parfüm", 100, {"Erkek Parfümü", 50, 15.5}};
    cout << "Kaç adet " << parfum.urun.adi << " satildi?" << endl;
    int satis_miktari;
    cin >> satis_miktari;
    satis(&parfum, satis_miktari, &kasa);
    return 0;
}

Class (Sınıf)

Sınıflar class ile tanımlanır.

class SinifAdi{};

Erişim Tanımlaması

public

Sınıf içerisinden, türetilmiş sınıflardan ve dışarıdan erişilebilir.

protected

Sınıf içerisinden ve türetilmiş sınıflardan erişilebilir. Dışarıdan erişilemez.

private

Sadece sınıf içerisinden erişilebilir. Türetilmiş sınıflardan ve dışarıdan erişilemez.

Özellikler

Sınıf içerisinde tanımlanan değişkenlere özellik deniyor. Sınıf içerisinde bir özellik tanımlamak değişken tanımlamak ile aynıdır. Ancak sınıf içerisinde olduğu için erişim tanımlaması ile nerelerden erişilebilir olduğunu belirleyebilirsiniz.

class SinifAdi{
    public:
    int genel = 5;

    protected:
    int aramizda = 10;

    private:
    int gizli = 15;
};

Metotlar

Tıpkı özellikler gibi metotlarda aslında sınıf içerisindeki fonksiyonlardır. Fonksiyonlar için geçerli olan kurallar geçerlidir. Fonksiyonlardaki gibi overloading (aşırı yükleme) yapılabilir.

class SinifAdi{
    public:
    void herkese_acik(){
        //kodlar...
    }

    protected:
    void aramizda_kalsin(){
        //kodlar...
    }

    private:
    void gizli(){
        //kodlar...
    }
};

Metot içinden Özelliklere ve Metotlara Ulaşmak

this ile yapılır.

class SinifAdi{
    private:
    int id = 0;

    public:
    int getId(){
        return this->id;
    }
    void setId(int id){
        this->id = id;
    }
    int id_ne(){
        return this->getId();
    }
};
Sınıfların Kullanılmasına Örnek
class SinifAdi{
    public:
    string name;
    private:
    int id = 0;

    public:
    int getId(){
        return this->id;
    }
    void setId(int id){
        this->id = id;
    }
    int id_ne(){
        return this->getId();
    }
};

int main(){
    SinifAdi sinif;
    sinif.name = "Sınıf Adı";
    cout<<sinif.name<<endl;
    sinif.setId(15);
    cout<<sinif.id_ne()<<endl;
    return 0;
}

Sınıfı bir pointer ile kullanmak için;

class SinifAdi{
    public:
    string name;
    private:
    int id = 0;

    public:
    int getId(){
        return this->id;
    }
    void setId(int id){
        this->id = id;
    }
    int id_ne(){
        return this->getId();
    }
};

int main(){
    SinifAdi *sinif = new SinifAdi();
    sinif->name = "Sınıf Adı";
    cout<<sinif->name<<endl;
    sinif->setId(15);
    cout<<sinif->id_ne()<<endl;
    return 0;
}

Kurucu Metot (Construct)

Sınıf ilk başlatıldığında çalışan metot kurucu metodudur. Sınıfın adı ile aynı isimde olmalıdır. Erişim tanımlaması public olmalıdır.

class SinifAdi{
    public:
    SinifAdi(){
        //kodlar...
    }
};

Kurucu metotlardaki overloading aşağıdakine benzer şekilde yapılabilir;

class SinifAdi{
    private:
    int id;

    public:
    SinifAdi(){
        this->id = 0;
    }

    SinifAdi(int id){
        this->id = id;
    }
};

Yıkıcı Metot (Deconstruct)

Sınıf bellek üzerinden silinmek istendiğinde çalışacak metottur. Sınıf adı ile aynı isimde olmalıdır. “~” ile ifade edilir.
Not : ~ sembolü Türkçe Q klavyelerde AltGR+Ü tuşları ile yapılmaktadır.

class SinifAdi{
    public:
    ~SinifAdi(){
        cout<<"Sinif Yok Edildi!"<<endl;
    }
};

int main(){
    SinifAdi *sinif = new SinifAdi();
    delete sinif;
    return 0;
}

Inherit (Miras/Kalıtım)

class Baba{
    public:
    string adi;
    string soyadi;
};

class Evlat: Baba{
    public:
    string adi;
};

Erişim Tanımlaması ile Miras Almak;

class Baba{
    public:
    string adi;
    string soyadi;
};

class Evlat: public Baba{
    public:
    string adi;
};

Küçük bir kullanım örneği;

class Baba{
    public:
    string adi;
    string soyadi;

    string getsoyadi(){
        return this->soyadi;
    }
};

class Evlat: public Baba{
    public:
    string adi;

    void adi_soyadi(){
        cout<<this->adi<<" "<< Baba::getsoyadi() <<endl;
    }
};

int main(){
    Evlat evlat;
    evlat.Baba::adi = "Mehmet";
    evlat.Baba::soyadi = "Falancaoğlu";
    evlat.adi = "Ahmet";
    evlat.adi_soyadi();
    return 0;
}

Multi Inherit (Çoklu Miras)

class Baba{};
class Anne{};
class Evlat: public Baba, public Anne{

};

Basit bir örnek;

class Baba{
    public:
    string adi;
    string soyadi = "Falancaoğlu";
    int boy;

    string getsoyadi(){
        return this->soyadi;
    }
};

class Anne{
    public:
    string adi;
    int boy;
    protected:
    string kizlik_soyadi = "Filancaoglu";
};

class Evlat: public Baba, public Anne{
    public:
    string adi;

    void adi_soyadi(){
        cout<<this->adi<<" "<< Baba::getsoyadi() <<endl;
    }
    void boy(){
        cout<< "Boyu " << (Baba::boy + Anne::boy) / 2 << "cm" <<endl;
    }
};

int main(){
    Evlat evlat;
    evlat.Baba::adi = "Mehmet";
    evlat.Baba::boy = 190;
    evlat.Anne::adi = "Ayşe";
    evlat.Anne::boy = 160;
    evlat.adi = "Ahmet";
    evlat.adi_soyadi();
    evlat.boy();
    return 0;
}

Namespace

namespace ile belirtilir.

namespace AdAlani{
    void hello_world(){
        cout<<"Hello World! I Ad Alanı."<<endl;
    }
}

Kullanım şekli örneği;

namespace AdAlani{
    void hello_world(){
        cout<<"Hello World! I Ad Alanı."<<endl;
    }

    class SinifAdi{
        public:
        void sinif_metot(){
            cout<<"AdAlani - SinifAdi"<<endl;
        }
    };
}

namespace IsimAlani{
    void hello_world(){
        cout<<"Hello World! I Isim Alanı."<<endl;
    }

    class SinifAdi{
        public:
        void sinif_metot(){
            cout<<"IsimAlani - IsimAlani"<<endl;
        }
    };
}


int main(){
    AdAlani::hello_world();
    AdAlani::SinifAdi ad_sinif;
    ad_sinif.sinif_metot();

    IsimAlani::hello_world();
    IsimAlani::SinifAdi isim_sinif;
    isim_sinif.sinif_metot();
    return 0;
}

using namespace kullanımı

namespace AdAlani{
    void hello_world(){
        cout<<"Hello World! I Ad Alanı."<<endl;
    }

    class SinifAdi{
        public:
        void sinif_metot(){
            cout<<"AdAlani - SinifAdi"<<endl;
        }
    };
}

namespace IsimAlani{
    void hello_world(){
        cout<<"Hello World! I Isim Alanı."<<endl;
    }

    class SinifAdi{
        public:
        void sinif_metot(){
            cout<<"IsimAlani - IsimAlani"<<endl;
        }
    };
}

using namespace AdAlani;

int main(){
    hello_world();
    SinifAdi ad_sinif;
    ad_sinif.sinif_metot();

    IsimAlani::hello_world();
    IsimAlani::SinifAdi isim_sinif;
    isim_sinif.sinif_metot();
    return 0;
}

Bir Cevap Yazın