معاملات الإدراج والاستخراج من التدفق
اجعل أنواعك تتفاعل مع std::cout عبر >.
معاملات الإدراج والاستخراج من التدفق درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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
إذا احتاج المعامل إلى الوصول إلى الأعضاء الخاصة، فأعلن عنه بوصفه 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 للقراءة المستندة إلى الأسطر، ثم حلّل البيانات باستخدام stringstream — فهذا يُبقي معامل >> بسيطًا.
نصيحة للأداء
للتسجيل بمعدل نقل مرتفع جدًا، فضّل المكتبات المتخصصة (spdlog وfmt) — فأداؤها يتجاوز التدفقات بفارق ملحوظ.
اختبار سريع
لماذا يُعرَّف operator<< لنوع يعرّفه المستخدم كدالة حرة بدلًا من كونه دالة عضو؟
مراجعة
حمّل operator<< وoperator>> زائدًا بوصفهما دالتين حرتين تستقبلان التدفق بالمرجع. أعد التدفق لتمكين التسلسل. اضبط failbit عند حدوث أخطاء في التحليل. استخدم friend عند الحاجة إلى الوصول إلى الأعضاء الخاصة.
الأسئلة الشائعة
هل درس «معاملات الإدراج والاستخراج من التدفق» مجاني؟
نعم — نص درس «معاملات الإدراج والاستخراج من التدفق» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «معاملات الإدراج والاستخراج من التدفق»؟
اجعل أنواعك تتفاعل مع std::cout عبر >. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «معاملات الإدراج والاستخراج من التدفق»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- معاملات الحساب والمقارنة
- معاملات الإدراج والاستخراج من التدفق
- معاملات الفهرسة واستدعاء الدوال
- معامل المقارنة ثلاثية الاتجاه في C++20