Stream operatörleri
- C++ kursu
- Orta seviye
- Ders 109/116
- 5 dk
<< 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
#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
#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ı
std::ostream& ____(std::ostream& os, const Point& p) { os << p.x; return os; }
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?
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.