0Pricing
C++ Academy · บทเรียน

ตัวดำเนินการแทรกและดึงข้อมูลจากกระแส

ทำให้ชนิดข้อมูลของคุณทำงานร่วมกับ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ตัวดำเนินการเลขคณิตและการเปรียบเทียบ
  2. ตัวดำเนินการแทรกและดึงข้อมูลจากกระแส
  3. ตัวดำเนินการดัชนีและเรียกฟังก์ชัน
  4. ตัวดำเนินการเปรียบเทียบสามทางใน C++20
← กลับไปที่ C++ Academy