ตัวดำเนินการแทรกและดึงข้อมูลจากกระแส
ทำให้ชนิดข้อมูลของคุณทำงานร่วมกับ std::cout ผ่าน >
ตัวดำเนินการแทรกและดึงข้อมูลจากกระแส เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงโอเวอร์โหลด << และ >>
ทำให้ชนิดข้อมูลของคุณทำงานร่วมกับ std::cout และ std::cin ได้ด้วยการโอเวอร์โหลดตัวดำเนินการของสตรีม
ตัวดำเนินการแทรกข้อมูล <<
กำหนดให้เป็นฟังก์ชันอิสระที่รับสตรีมเอาต์พุตแบบการอ้างอิง คืนค่าสตรีมเพื่อให้สามารถเรียกต่อกันเป็นสายได้
struct Point { int x, y; };
std::ostream& operator<<(std::ostream& os, const Point& p) {
return os << "(" << p.x << ", " << p.y << ")";
}
Point p{3, 4};
std::cout << p << "\n"; // (3, 4)เหตุใดจึงใช้ฟังก์ชันอิสระ
หากเขียนเป็นฟังก์ชันสมาชิก ตัวถูกดำเนินการด้านซ้ายจะต้องเป็น Point ซึ่งเป็นไปไม่ได้ เพราะเราต้องมี std::ostream อยู่ด้านซ้าย ฟังก์ชันอิสระจึงรองรับการเรียงลำดับได้ทั้งสองแบบ
ตัวดำเนินการดึงข้อมูล >>
กำหนดสำหรับการอ่านจากสตรีมอินพุต ตรวจสอบความถูกต้องและตั้งค่า failbit เมื่อเกิดความล้มเหลว
std::istream& operator>>(std::istream& is, Point& p) {
char open, comma, close;
is >> open >> p.x >> comma >> p.y >> close;
if (open != '(' || comma != ',' || close != ')')
is.setstate(std::ios::failbit);
return is;
}การตั้งค่าสถานะความล้มเหลวของสตรีม
หากการแยกวิเคราะห์ล้มเหลว ให้เรียก is.setstate(std::ios::failbit) ผู้เรียกสามารถตรวจพบความล้มเหลวได้ด้วย !is หรือ is.fail()
การประกาศเพื่อน
หากตัวดำเนินการจำเป็นต้องเข้าถึงสมาชิกส่วนตัว ให้ประกาศเป็น friend ภายในคลาส
class Point {
int x_, y_;
public:
friend std::ostream& operator<<(std::ostream& os, const Point& p);
};ชนิดข้อมูลสตรีมแบบแม่แบบ
เพื่อให้พกพาได้สูงสุด ให้สร้างแม่แบบโดยอิงตามชนิดอักขระ ซึ่งมีประโยชน์สำหรับสตรีมอักขระแบบกว้าง
template <typename CharT>
std::basic_ostream<CharT>& operator<<(
std::basic_ostream<CharT>& os, const Point& p) {
return os << "(" << p.x << ", " << p.y << ")";
}การเรียกต่อกันเป็นสาย
การคืนค่าสตรีมทำให้ผู้ใช้สามารถเรียกการดำเนินการต่อกันเป็นสายได้
std::cout << "Result: " << point << ", distance: " << dist;การจัดรูปแบบแบบกำหนดเอง
ใช้ std::ios::fmtflags หรือ std::format ใน C++20 สำหรับการจัดรูปแบบขั้นสูง สตรีมใช้งานง่ายกว่า แต่ทำให้การปรับให้เข้ากับภาษาท้องถิ่นทำได้ยากกว่า
เอาต์พุตรูปแบบ JSON
คุณสามารถจัดลำดับตัวเลือกการจัดรูปแบบไว้ในตัวดำเนินการได้ สำหรับเอาต์พุตที่ซับซ้อน ให้เขียนฟังก์ชันช่วย
การอ่านหลายบรรทัด
ใช้ std::getline สำหรับการอ่านทีละบรรทัด จากนั้นแยกวิเคราะห์ด้วยสตริงสตรีม วิธีนี้ทำให้ operator>> ของคุณเรียบง่าย
เคล็ดลับด้านประสิทธิภาพ
สำหรับการบันทึกข้อมูลที่มีปริมาณงานสูงมาก ควรใช้ไลบรารีเฉพาะทาง (spdlog, fmt) เพราะมีประสิทธิภาพเหนือกว่าสตรีมอย่างมาก
ตรวจสอบอย่างรวดเร็ว
เหตุใด operator<< สำหรับชนิดข้อมูลที่ผู้ใช้กำหนดจึงต้องประกาศเป็นฟังก์ชันอิสระแทนที่จะเป็นฟังก์ชันสมาชิก
สรุปทบทวน
โอเวอร์โหลด operator<< และ operator>> เป็นฟังก์ชันอิสระที่รับสตรีมแบบการอ้างอิง คืนค่าสตรีมเพื่อให้เรียกต่อกันเป็นสาย ตั้งค่า failbit เมื่อเกิดข้อผิดพลาดในการแยกวิเคราะห์ ใช้ friend เมื่อต้องเข้าถึงสมาชิกส่วนตัว
คำถามที่พบบ่อย
บทเรียน “ตัวดำเนินการแทรกและดึงข้อมูลจากกระแส” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ตัวดำเนินการแทรกและดึงข้อมูลจากกระแส” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ตัวดำเนินการแทรกและดึงข้อมูลจากกระแส”
ทำให้ชนิดข้อมูลของคุณทำงานร่วมกับ std::cout ผ่าน > คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “ตัวดำเนินการแทรกและดึงข้อมูลจากกระแส” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ตัวดำเนินการเลขคณิตและการเปรียบเทียบ
- ตัวดำเนินการแทรกและดึงข้อมูลจากกระแส
- ตัวดำเนินการดัชนีและเรียกฟังก์ชัน
- ตัวดำเนินการเปรียบเทียบสามทางใน C++20