C++ Referanslar


#1
C++ Referanslar
  * {
    font-family: Georgia, Cambria, "Times New Roman", Times, serif;
  }
  html, body {
    margin: 0;
    padding: 0;
  }
  h1 {
    font-size: 50px;
    margin-bottom: 17px;
    color: #333;
  }
  h2 {
    font-size: 24px;
    line-height: 1.6;
    margin: 30px 0 0 0;
    margin-bottom: 18px;
    margin-top: 33px;
    color: #333;
  }
  h3 {
    font-size: 30px;
    margin: 10px 0 20px 0;
    color: #333;
  }
  header {
    width: 640px;
    margin: auto;
  }
  section {
    width: 640px;
    margin: auto;
  }
  section p {
    margin-bottom: 27px;
    font-size: 20px;
    line-height: 1.6;
    color: #333;
  }
  section img {
    max-width: 640px;
  }
  footer {
    padding: 0 20px;
    margin: 50px 0;
    text-align: center;
    font-size: 12px;
  }
  .aspectRatioPlaceholder {
    max-width: auto !important;
    max-height: auto !important;
  }
  .aspectRatioPlaceholder-fill {
    padding-bottom: 0 !important;
  }
  header,
  section[data-field=subtitle] {
    display: none;
  }
  </style></head><body><article class="h-entry">

C++ Referanslar

C dilinde kullandığımız pointerlar konusu C++ dilinde yerini referanslara bırakıyor. Ama C++ içinde de pointerları kullanabiliyorsunuz. Referanslar programcıya daha kolay bir kullanım sunuyor. Kullanıdığımız referanslar sadece notasyonel bir hile, arka planda aslında pointerlar…

~> Referans makina ile ilgili bir kavram değil, makinada yine herşey adresler, referans sadece notasyonel bir hile…

~> & bu bir declarator, adres operatörle karıştırmamak gerekiyor. Çünkü bu tanımda kullanılıyor.

~> Referansların Pointerlardan tek farkı seviyesi yükseltilmiş

~> İlk değer vermeden referans oluşturmak sentaks hatası


~> Aslında ben r dediğimde *ptr gibi bir yapı kullanıyorum ama bu artık derleyiciyi ilgilendiren kısım. Bizim işimizi tamamen kolaylaştıran bir yapı.

~> C++11 ile gelen yeni araçlarla birlikte tür kontrolü çok daha fazla artmıştır.


~> Referansları kullanma amacımız temel olarak call by reference yapmak

~> C dilinde call by reference yapmanın tek yolu var, adresini fonksiyona göndermek…(fonksiyonun parametresi pointer olması gerekir)

~> C++ da buna ikinci bir yöntem geliyor


Soru: C++ dilinde biri *ptr ile yazılmış bir fonksiyon var biri de &r parametresiyle yazılmış bir fonksiyon var.. Hangisi daha verimli?

Burada pointer ile referans arasında ki ilişki mantık anlaşılmış mı açısından güzel bir soru. Her iki semantik ile birer swap fonksiyonu yazalım.

Cevap: Hiçbir farkı yok, ikisinde de aynı makina kodunu üretir. Kullanabildiğimiz heryerde referans kullanacağız, mecbur olduğumuz birkaç senaryo da pointer kullanacağız.


~> Referanslar kendisi const olan bir pointerın seviyesi yükseltilmiş hali. Burayı anlamak çok önemli, scope boyunca referans gösterdiği nesneyi temsil eder, başka bir nesneyi gösteremez. Yani referanslara ilk değer vermek zorunlu derken arka plan da const oldukları için…


~> Böyle bir durumda func() fonksiyonunu sabit ile çağıramayız ancak nesne ile çağırabiliriz.

~> Ama foo() gibi bir fonksiyon gördüğümüzde buna sabitte gönderebiliriz.

~> Burada ki hikaye şöyle const bir referasa sabitle ilk değer verdiğimizde derleyici arka planda geçici bir nesne oluşturuyor.

~> Geçici nesneler bu dilde const kabul ediliyor


ADRESE GERİ DÖNEN FONKSİYONLAR (C Pointer Semantiğinde)

~> Yapılabilecek en kaba hatalardan biri otomatik ömürlü nesnenin adresi ile geri dönmek, otomatik ömürlü demek bir fonksiyonun çalışmasının bitmesiyle nesnenin bellekten silinmesidir…

Adrese geri dönen fonksiyonlar run time hatası olmadan neye geri dönebilir?

  1. Static bir nesnenin adresi ile geri dönebilirler, programın başından sonuna bellekte duruyor…
    Static nesneler neler? static keywordü alan, global değişkenler, stringler
    Kim beni çağırırsa çağırsın ona aynı değeri geri dönüyorum demek
  2. Dinamik ömürlü nesne adresi,
  3. Kendi adresiyle geri dönen (sizden alıyor size veriyor)

~> Yeniden bir hatırlatma pointer to pointer var ama reference to reference yok

~> R value reference konusunu ilerde tek makale olarak anlatabiliriz.

~> Move semantiği için sağ taraf değeri uydurulmuş.


cout nesnesini func fonksiyonuna gönderdiğimde kendisi geri döndürecek

~> Elemanları referans olan bir dizi diye bir kavram yok. Ama bir referans dizi yerine geçebilir.


POINTERLAR vs REFERANSLAR

Özetleyecek olursak;

~> Bir pointer kendisi const olmak zorunda değil, hayatı devam ettiği sürece farklı nesneleri gösterebilir

~> Referansta böyle değil kendi const, referans hep aynı nesnenin yerine geçer

~> Elemanların referans olan bir dizi diye birşey yok ama bir referans bir dizinin yerine geçebilir

~> Pointer dizileri var


~> referansın referansı yok

~> C ve C++ pointer değişkenler iki konumda olabilir ya bir nesneyi gösterirler yada hiçbir şey göstermiyorlardır

~> Bir nesneyi gösteriyorlarsa pointerın değeri o nesnenin adresi, hiçbir yeri göstermiyorsa null adresidir


Daha birçok örnek verilebilir, eğer referanslar konusuna devam edersem referanslar 2 diye başlık atarım.

Kaynak: https://goo.gl/LXeZGK