这道题考察的是 C++ 输出流运算符 << 的重载规则,核心在于为什么必须用友元(friend)函数重载,以及参数传递的规范。 核心结论 不能实现输出流重载声明的选项是:A、C、D。 只有 B 选项是正确的声明方式。 详细解析 1. 为什么必须是 friend (友元)?(排除 A) - 原理: operator<< (输出流)是一个全局函数。 - 矛盾点:如果我们在类内部定义普通成员函数 operator<< ,那么第一个参数必须是该类的对象(例如 c << cout ),这完全违背了流操作的语法( cout << c )。 - 解决方案:必须将其声明为类的友元函数,这样它才能访问类的私有成员(如 num ),且作为全局函数拥有两个参数。 - 判定:A 选项没有 friend 关键字,且参数形式是普通全局函数的写法,不能访问私有成员 num ,所以错误。 2. 为什么参数必须是 ostream& (引用)?(排除 C、D) - 原理:流对象(如 cout )是不可拷贝的,且为了支持链式编程(如 cout << a << b; ),必须返回操作对象本身的引用。 - C 选项错误: ostream my_os 采用值传递,这会导致流对象被拷贝,而流类通常禁用了拷贝构造函数,直接导致编译报错。 - D 选项错误:虽然参数是引用,但返回值是 ostream (值),无法支持链式调用( cout << c1 << c2 会在第二个 << 时出错),且语法上不规范。 - B 选项正确: ostream &my_os 是引用传递, return my_os; 返回的也是引用,完美支持链式操作。 总结 实现 C++ 类输出流重载的标准模板如下: cpp class C { // ... friend ostream& operator<<(ostream& os, const C& c); // 建议加上 const,保证常量对象也能输出 private: int num; }; // 外部实现 ostream& operator<<(ostream& os, const C& c) { os << c.num; // 访问私有成员 return os; // 支持链式调用 } 这道题的三个错误点非常典型:缺友元、传值、非引用返回,只要抓住这三点就能秒杀此类题目。