CodeBlanks Logo Icon CodeBlanks

Stream operatörleri

<< ve >> operatörlerini aşırı yüklemeyi öğrenirsin.

Stream operatörleri

operator<< ve operator>> bir nesneyi akışa yazmayı ve akıştan okumayı sağlar. Bu operatörler sınıfın üyesi değil, global fonksiyon olarak tanımlanır.

Örnek: std::ostream& operator<<(std::ostream& os, const Point& p) { os << p.x << " " << p.y; return os; }. Bu, std::cout << p; yazmanı sağlar. Fonksiyon std::ostream& döndürür; bu, zincirleme (std::cout << a << b) sağlar. Neden global? Çünkü sol taraf senin sınıfın değil, std::ostream'dir. Üye operatör olsaydı std::ostream içine eklenmesi gerekirdi ki bu mümkün değildir.

Zincirleme ve return os

operator<< fonksiyonu return os; ile akışı döndürür. Bu, birden çok nesneyi arka arkaya yazmayı sağlar.

Örnek: std::cout << a << " " << b; ifadesi şöyle çalışır: önce operator<<(std::cout, a) çağrılır ve std::cout döner. Sonra dönen akışa " " yazılır ve yine akış döner. En son b yazılır. Eğer fonksiyon void döndürseydi zincirleme çalışmazdı; std::cout << a << b derleme hatası verirdi. Bu yüzden return os; satırı zorunludur.

Uygulama Point için operator<< ekle

Başlangıç kodundaki Point sınıfı için global bir operator<< fonksiyonu ekle: std::ostream& operator<<(std::ostream& os, const Point& p) { os << p.x << " " << p.y; return os; }. main içinde std::cout << p; ile noktayı yazdır.

Başlangıç kodu

main.cpp
#include <iostream>

class Point {
public:
    int x;
    int y;
    Point(int x_, int y_) : x(x_), y(y_) {}
    // Çıktı operatörü sınıf dışında tanımlanır
};

// Çıktı operatörünü buraya ekle

int main() {
    Point p(3, 7);
    // p'yi std::cout ile yazdır
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>

class Point {
public:
    int x;
    int y;
    Point(int x_, int y_) : x(x_), y(y_) {}
};

std::ostream& operator<<(std::ostream& os, const Point& p) {
    os << p.x << " " << p.y;
    return os;
}

int main() {
    Point p(3, 7);
    std::cout << p;
    return 0;
}

Beklenen çıktı

3 7

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Stream operatörü imzası

Soru
std::ostream& ____(std::ostream& os, const Point& p) { os << p.x; return os; }
Cevap
std::ostream& operator<<(std::ostream& os, const Point& p) { os << p.x; return os; }

Açıklama: operator<< çıkış akışına yazma operatörüdür.

2 Parçayı rolüne eşle

Kavram Anlamı
operator<< Çıkış akışına yazma
operator>> Giriş akışından okuma
std::ostream& Dönüş türü
return os Akışı döndürme

3 operator<< neden global fonksiyon olarak tanımlanır?

main.cpp
std::ostream& operator<<(std::ostream& os, const Point& p);
  • Daha hızlı olduğu için
  • Derleyici zorunlu kıldığı için
  • Sınıf içinde yazılamadığı için
  • Sol taraf std::ostream olduğu için Doğru cevap

Açıklama: Sol taraf senin sınıfın değil, std::ostream'dir.

Orta seviye bölümündeki tüm dersler