C++中重载输入输出运算符的注意事项与友元函数

需积分: 9 8 下载量 48 浏览量 更新于2024-08-19 收藏 3.65MB PPT 举报
"C++重载输入输出运算符通常不应作为类的成员函数,而应使用友元函数。这是因为成员函数的左运算数总是类的对象,但输入/输出运算符期望左侧是流对象,右侧是类的对象。因此,为了正确重载`<<`和`>>`运算符,我们需要定义非成员友元函数。例如,对于一个名为`Aircraft`的类,我们可以这样重载: ```cpp class Aircraft { // ... friend std::ostream& operator<<(std::ostream& os, const Aircraft& aircraft); friend std::istream& operator>>(std::istream& is, Aircraft& aircraft); // ... }; std::ostream& operator<<(std::ostream& os, const Aircraft& aircraft) { os << "Wingspan: " << aircraft.wingspan << ", Passengers: " << aircraft.passengers; return os; } std::istream& operator>>(std::istream& is, Aircraft& aircraft) { is >> aircraft.wingspan >> aircraft.passengers; return is; } ``` 在C++中,程序结构通常包括分支结构(如`if`、`switch`等)和循环结构(如`for`、`while`等)。例如,从描述中提到的教材《计算机程序设计基础》中的P58页,可以看到分支结构的图示和循环结构的实例。程序设计中,常常会涉及结构体的使用,如定义一个`Aircraft`结构体来表示飞机,其中包含翼幅、乘客数量等属性。结构体成员的赋值和输出可以通过重载的输入输出运算符实现。 此外,程序设计的一个关键原则是数据封装和模块化。C++通过类支持这种思想,将数据和操作数据的函数封装在一起。函数的使用使得代码更加模块化,便于理解和维护。例如,可以编写一个`Swap`函数来交换两个整数的值,通过引用参数实现真正的交换。函数可以有默认参数,如`get_volume`函数计算体积,允许用户不提供所有参数时使用默认值。程序设计的流程通常是自顶向下,逐步细化,通过主函数调用子函数来实现功能。 面向对象编程(OOP)是C++中的核心概念,它强调通过对象来描述问题。每个对象都有自己的属性(数据成员)和行为(成员函数),并且可以通过继承和派生来构建类的层次结构。类的成员可以有不同的访问权限,保护对象的内部实现细节不被外部随意访问。析构函数在对象销毁之前自动执行,用于清理资源或执行必要的收尾工作。通过分解复杂对象,我们可以用简单的对象组合来理解它们,这在设计和实现大型系统时尤其有用。 函数和类都是封装的工具,但函数是单一功能的封装,而类则结合了数据和相关操作。类内的函数可以声明为内联,以减少函数调用的开销。构造函数用于初始化对象,而析构函数用于对象生命周期结束时的清理。在类的声明中定义构造函数和析构函数,但在类外实现成员函数,并使用`inline`关键字声明为内联函数,可以优化代码性能。" 以上内容详细解释了C++中重载输入输出运算符的规则、程序设计的基本结构、面向对象编程的核心概念以及函数和类的封装特性。