İş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 yığın ve öbek belleğini anladığınıza göre, bellek konumlarıyla doğrudan çalışmanızı sağlayan araçları inceleyelim: işaretçiler ve referanslar.
İşaretçi, başka bir değişkenin bellek adresini depolar. İşaretçiyi * ile tanımlar ve & kullanarak bir adres alırsın.
int value = 42;
int* ptr = &value; // ptr, value'nin adresini tutar
std::cout << ptr; // Bellek adresini yazdırır
std::cout << *ptr; // Dereference: 42 yazdırırReferans, mevcut bir değişken için bir takma addır. Bağlandıktan sonra her zaman o değişkeni ifade eder. Onu & ile bildirirsiniz.
int value = 42;
int& ref = value; // ref, value için bir takma addır
ref = 100; // value'yu 100 yapar
std::cout << value; // 100 yazdırırTemel farklar:
| İşaretçiler | Referanslar |
|---|---|
| null olabilir | Başlatılmalıdır |
| Yeniden atanabilir | Yeniden 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 yığın üzerinde ayrılmış bellekle çalışmak için gereklidir. Referanslar daha güvenli ve basittir; işaretçiler ise yeniden atama yapmanız veya null değerini kontrol etmeniz gerektiğinde daha fazla esneklik sunar.
Görev
KolayVerileri değiştirirken işaretçilerin ve referansların nasıl farklı çalıştığını gösteren basit bir değer değiştirme sistemi oluşturalım.
Kodunuzu düzenlemek için iki dosya oluşturacaksınız:
ValueOps.h: Tamsayı değerlerini farklı şekillerde değiştiren üç işlev tanımlayın:doubleByPointer(int* ptr): bir işaretçi alır ve işaret ettiği değeri iki katına çıkarırtripleByReference(int& ref): bir referans alır ve değeri üç katına çıkarırswapValues(int* a, int* b): iki işaretçi alır ve işaret ettikleri değerleri yer değiştirir
main.cpp: Girdiden iki tamsayı okuyun, ardından hem işaretçileri hem de referansları gösterin:- Orijinal değerleri yazdırın:
"Original: <first> <second>" - İlk değer üzerinde
doubleByPointerkullanın, ardından şunu yazdırın:"After double: <first>" - İkinci değer üzerinde
tripleByReferencekullanın, ardından şunu yazdırın:"After triple: <second>" - Her iki değeri yer değiştirmek için
swapValueskullanın, ardından şunu yazdırın:"After swap: <first> <second>"
- Orijinal değerleri yazdırın:
İşaretçilerle işlev çağırırken değişkenin adresini geçirmek için adres operatörünü (&) kullanmayı unutmayın. Referanslar daha doğal çalışır; değişkeni doğrudan geçirmeniz yeterlidir.
Başlık dosyanızı main.cpp içine #include "ValueOps.h" kullanarak ekleyin.
Kendin dene
#include <iostream>
#include "ValueOps.h"
using namespace std;
int main() {
// Girişten iki tamsayı oku
int first, second;
cin >> first;
cin >> second;
// Orijinal değerleri yazdır
cout << "Original: " << first << " " << second << endl;
// TODO: İlk değerde doubleByPointer kullan (adresi & kullanarak geçir)
// TODO: İkiye katladıktan sonra yazdır
// TODO: İkinci değerde tripleByReference kullan (değişkeni doğrudan geçir)
// TODO: Üçe katladıktan sonra yazdır
// TODO: Her iki değeri takas etmek için swapValues kullan (adresleri & kullanarak geçir)
// TODO: Takastan 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
1OOP Temelleri
Harici DosyalarC++ Build ve DerlemeBaşlık Dosyaları ve Kaynak DosyalarıAd Alanları ve KapsamC++'ta OOP'ye GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriÖzet - Basit Hesap Makinesi4Sınıf Özellikleri
Örnek ve Statik ÜyelerGetter ve Setter MetotlarıConst Üye FonksiyonlarMutable Anahtar KelimesiStatik 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 SeviyeleriCtor ve Dtor Çağrılma SırasıMetot Geçersiz KılmaSanal Fonksiyonlar ve VTableÇoklu KalıtımSanal KalıtımÖzet - Çalışan Hiyerarşisi10STL Genel Bakış
STL Genel Bakış ve FelsefesiSTL KonteynerleriİteratörlerSTL AlgoritmalarıFunctor'lar ve Lambda İfadeleriÖzet - Kelime Frekansı13Tasarım Kalıpları 1. Bölüm
Tasarım Kalıplarına GirişSingleton KalıbıFactory ve Abstract FactoryBuilder KalıbıObserver KalıbıStrategy Kalıbı2Bellek Yönetimi
Stack ve Heap Bellekİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++'ta Akıllı İşaretçilerC++'ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'da Erişim BelirleyicilerDerinlemesine Erişim BelirleyicilerBilgi GizlemeStruct vs Classİç İçe ve Dahili SınıflarÖzet - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme 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ıDynamic Casting ve RTTIÖzet - Şekil Hesaplayıcı3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopya YapıcıTaşıma YapıcısıYapıcı İlklendirme ListeleriTemsilci YapıcılarYıkıcılara Derinlemesine BakışÜç / 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ör Aşırı YüklemeKarşılaştırma Operatörü Aşırı YüklemeStream OperatörleriAtama Operatörü Aşırı Yükleme[] ve () Operatör Aşırı YüklemeTip Dönüşüm OperatörleriÖzet - Matris Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeVariadic ŞablonlarSFINAE ve Type Traits TemelleriÖzet - Generic KonteynerKendi başına pratik yap: Online C++ derleyicisi