C++
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.
Örnek çözümü göster
#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;
}
Kendini test et
-
Stream operatörü imzası
std::ostream& ____(std::ostream& os, const Point& p) { os << p.x; return os; }
Cevabı göster
std::ostream& operator<<(std::ostream& os, const Point& p) { os << p.x; return os; }
-
Parçayı rolüne eşle
- operator<<
- Çıkış akışına yazma
- operator>>
- Giriş akışından okuma
- std::ostream&
- Dönüş türü
- return os
- Akışı döndürme
-
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
Cevabı göster
Sol taraf std::ostream olduğu için — Sol taraf senin sınıfın değil, std::ostream'dir.
Sıradaki ders: spaceship operatörü