首页 > 试题广场 >

C++ 中,已知类 C 的部分定义如下: class C {

[不定项选择题]
C++ 中,已知类 C 的部分定义如下:
class C {

public:
    //__________________

private:
    int num;
};
请问在以上横线填入下面哪些选项后不能实现对类 C 的输出流重载的声明()
  • ostream & operator << (ostream &my_os, C &c);
  • friend ostream & operator << (ostream &my_os, C &c);
  • friend ostream & operator << (ostream my_os, C &c);
  • friend ostream operator << (ostream &my_os, C &c);
答案 正确答案是 ACD。 解析 - 选项A:输出流重载函数一般定义为友元函数,这样才能访问类的私有成员。此选项没有将函数声明为友元函数, operator<< 函数无法访问类 C 的私有成员 num  ,所以不能实现对类 C 的输出流重载声明 。 - 选项B:该声明将 operator<< 函数声明为类 C 的友元函数,返回值类型为 ostream&  ,参数为 ostream& (输出流对象引用)和 C& (类 C 对象引用) ,符合输出流重载函数的声明规范,可以实现对类 C 的输出流重载声明。 - 选项C:输出流重载函数的第一个参数应该是 ostream& (输出流对象的引用),这里是 ostream (输出流对象),传值方式不符合要求,会导致函数调用时产生不必要的拷贝,并且不能实现对类 C 的正确输出流重载声明。 - 选项D:输出流重载函数的返回值类型应该是 ostream&  ,以支持连续输出(如 cout << a << b;  ),这里返回值类型是 ostream  ,不符合规范,不能实现对类 C 的输出流重载声明。
发表于 2025-05-19 21:04:15 回复(1)
这道题考察的是 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; // 支持链式调用 }   这道题的三个错误点非常典型:缺友元、传值、非引用返回,只要抓住这三点就能秒杀此类题目。
发表于 2026-03-11 09:33:42 回复(0)