İşaretçiler ve Referanslar
Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 13 / 104.
Artık stack ve heap belleğini anladığına göre, bellek konumlarıyla doğrudan çalışmanı sağlayan araçları inceleyelim: işaretçiler ve referanslar.
Bir işaretçi, başka bir değişkenin bellek adresini saklar. Onu * ile tanımlarsın ve & kullanarak bir adres alırsın.
int value = 42;
int* ptr = &value; // ptr, value değişkeninin adresini tutar
std::cout << ptr; // Bellek adresini yazdırır
std::cout << *ptr; // İşaretçinin gösterdiği değere erişir: 42 değerini yazdırırReferans, mevcut bir değişkenin takma adıdır. Bağlandıktan sonra her zaman o değişkeni gösterir. Onu & ile tanımlarsın.
int value = 42;
int& ref = value; // ref, value için bir takma addır
ref = 100; // value değerini 100 olarak değiştirir
std::cout << value; // 100 yazdırırTemel farklar:
| İşaretçiler | Başvurular |
|---|---|
| null olabilir | Başlatılmaları gerekir |
| Yeniden atanabilir | Başka bir şeye bağlanamaz |
Değere erişmek için * kullanılır | Değere doğrudan erişilir |
| Hiçbir şeyi göstermeyebilir | Her zaman geçerlidir |
Her ikisi de nesneleri kopyalamadan işlevlere verimli bir şekilde aktarmak ve heap belleğinde ayrılmış bellekle çalışmak için gereklidir. Referanslar daha güvenli ve basittir; işaretçiler ise yeniden atama yapmanız veya null olup olmadığını kontrol etmeniz gerektiğinde daha fazla esneklik sunar.
Görev
KolayVerileri değiştirirken işaretçilerin ve başvuruların nasıl farklı çalıştığını gösteren basit bir değer değiştirme sistemi oluşturalım.
Kodunu düzenlemek için iki dosya oluşturacaksın:
ValueOps.h: Tamsayı değerlerini farklı şekillerde değiştiren üç işlev tanımla:doubleByPointer(int* ptr): Bir işaretçi alır ve işaret ettiği değeri ikiyle çarpartripleByReference(int& ref): Bir başvuru alır ve değeri üçle çarparswapValues(int* a, int* b): İki işaretçi alır ve işaret ettikleri değerleri takas eder
main.cpp: Girdiden iki tamsayı oku, ardından hem işaretçileri hem de başvuruları kullanarak örnek göster:- Başlangıç değerlerini yazdır:
"Original: <first> <second>" - İlk değerde
doubleByPointerkullan, ardından şunu yazdır:"After double: <first>" - İkinci değerde
tripleByReferencekullan, ardından şunu yazdır:"After triple: <second>" - İki değeri takas etmek için
swapValueskullan, ardından şunu yazdır:"After swap: <first> <second>"
- Başlangıç değerlerini yazdır:
İşaretçilerle işlev çağırırken değişkenin adresini geçirmek için adres operatörünü (&) kullanmayı unutma. Başvurular daha doğal çalışır; değişkeni doğrudan geçirmen yeterlidir.
Başlık dosyanı main.cpp dosyasına #include "ValueOps.h" kullanarak ekle.
Kendin dene
#include <iostream>
#include "ValueOps.h"
using namespace std;
int main() {
// Girdiden iki tamsayı oku
int first, second;
cin >> first;
cin >> second;
// Orijinal değerleri yazdır
cout << "Original: " << first << " " << second << endl;
// TODO: İlk değer üzerinde doubleByPointer kullan (adresi & ile geçir)
// TODO: İkiye katladıktan sonra yazdır
// TODO: İkinci değer üzerinde tripleByReference kullan (değişkeni doğrudan geçir)
// TODO: Üçe katladıktan sonra yazdır
// TODO: Her iki değerin yerini değiştirmek için swapValues kullan (adresleri & ile geçir)
// TODO: Yerlerini değiştirdikten sonra yazdır
return 0;
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Nesne Yönelimli Programlamanın Temelleri
Harici DosyalarC++ Derleme ve Derleme SüreciHeader Dosyaları ve Kaynak DosyalarıNamespace'ler ve KapsamC++'ta Nesne Yönelimli Programlamaya GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriTekrar - Basit Hesap Makinesi4Sınıf Özellikleri
Nesne ve Statik ÜyelerGetter ve Setter'larconst Üye Fonksiyonlarımutable Anahtar SözcüğüStatik Metotlar ve DeğişkenlerFriend Fonksiyonlar ve SınıflarÖzet - Banka Hesabı Yöneticisi7Kalıtım
Temel KalıtımKalıtım Erişim DüzeyleriCtor ve Dtor Çağrı SırasıMetot Geçersiz KılmaVirtual Fonksiyonlar ve VTableÇoklu KalıtımVirtual KalıtımÖzet - Çalışan Hiyerarşisi2Bellek Yönetimi
Stack ve Heap Belleğiİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++’ta Akıllı İşaretçilerC++’ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'ta Erişim BelirleyicileriErişim Belirleyicilerine Derinlemesine BakışBilgi GizlemeStruct ve Class Karşılaştırmasıİç İçe ve İç SınıflarTekrar - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme Zamanı ve Çalışma Zamanı Çok BiçimliliğiFonksiyon Aşırı YüklemeSanal Fonksiyonlara Yeniden BakışSaf Sanal FonksiyonlarSoyut SınıflarC++'ta Arayüz TasarımıDinamik Tür Dönüştürme ve RTTITekrar - Şekil Hesaplayıcı11İleri Düzey OOP Kavramları
Bileşim ve KalıtımCRTP ile Mixin'lerPimpl İdiomuTür SilmeEnum Sınıfları ve Güçlü TürlemeOOP'de İstisna YönetimiÖzel İstisna Hiyerarşileri14Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik KalıpBir Kalıp Olarak RAII3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopyalama YapıcısıTaşıma YapıcısıYapıcı Başlatma ListeleriYönlendiren YapıcılarYıkıcıları Derinlemesine İncelemeÜç / Beş / Sıfır KuralıÖzet - String Sınıfı6Operatör Aşırı Yükleme
Operatör Aşırı Yüklemeye GirişAritmetik Operatörleri Aşırı YüklemeKarşılaştırma Operatörlerini Aşırı YüklemeAkış OperatörleriAtama Operatörünü Aşırı Yükleme[] ve () Operatörlerini Aşırı YüklemeTür Dönüşüm OperatörleriTekrar - Matrix Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeDeğişken Sayıda Argüman Alan ŞablonlarSFINAE ve Tür Özelliklerinin TemelleriTekrar: Genel Amaçlı KapsayıcıKendi başına pratik yap: Online C++ derleyicisi