C++操作符重载完全教程:Cpp-Primer第十四章自定义类型操作
【免费下载链接】Cpp-Primer C++ Primer 5 answers 项目地址: https://gitcode.com/gh_mirrors/cp/Cpp-Primer
想要掌握C++编程的核心技能?操作符重载就是你必须了解的重要概念!🎯 作为C++ Primer第十四章的核心内容,操作符重载让你能够为自定义类型定义类似内置类型的行为,极大地提升代码的可读性和易用性。
什么是操作符重载?
操作符重载是C++中一项强大的特性,允许你为自定义类类型重新定义操作符的含义。通过操作符重载,你可以让自定义类型的对象像内置类型一样进行加法、减法、比较等操作。🚀
想象一下,如果你能直接使用 obj1 + obj2 这样的语法来处理自定义对象,而不是调用繁琐的成员函数,代码将变得更加直观和优雅!
操作符重载的基本规则
重载与内置操作符的异同
相同点:
- 重载操作符具有与内置操作符相同的优先级和结合性
- 使用语法完全相同
不同点:
- 可以像普通函数一样直接调用重载的操作符函数
- 重载操作符函数必须是类的成员或至少有一个类类型参数
- 某些操作符(如逻辑AND、OR)的重载版本不保持短路求值特性
哪些操作符可以重载?
绝大多数C++操作符都可以重载,包括:
- 算术操作符:
+,-,*,/,% - 关系操作符:
==,!=,<,>,<=,>= - 赋值操作符:
=,+=,-=等 - 下标操作符:
[] - 函数调用操作符:
()
实战案例:Sales_data类的操作符重载
让我们通过Cpp-Primer项目中的实际例子来学习操作符重载的实现。
输入输出操作符重载
在 ch14/ex14_02.h 和 ch14/ex14_02.cpp 文件中,我们可以看到Sales_data类的完整操作符重载实现:
// 输入操作符重载
std::istream& operator>>(std::istream &is, Sales_data &item)
{
double price = 0.0;
is >> item.bookNo >> item.units_sold >> price;
if (is)
item.revenue = price * item.units_sold;
else
item = Sales_data();
return is;
}
// 输出操作符重载
std::ostream& operator<<(std::ostream &os, const Sales_data &item)
{
os << item.isbn() << " " << item.units_sold << " " << item.revenue << " " << item.avg_price();
return os;
}
算术操作符重载
// 加法操作符重载
Sales_data operator+(const Sales_data &lhs, const Sales_data &rhs)
{
Sales_data sum = lhs;
sum += rhs;
return sum;
}
// 复合赋值操作符重载
Sales_data& Sales_data::operator+=(const Sales_data &rhs)
{
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return *this;
}
操作符重载的最佳实践
成员函数 vs 非成员函数
应该作为成员函数的情况:
- 赋值操作符:
=,+=,-= - 下标操作符:
[] - 函数调用操作符:
() - 箭头操作符:
->
应该作为非成员函数的情况:
- 对称操作符:
==,+,-等
效率优化技巧
在实现操作符重载时,推荐让 operator+ 调用 operator+=,而不是反过来。这样可以利用复合赋值操作符的效率优势,避免不必要的临时对象创建。
常见操作符重载模式
关系操作符重载
在 ch14/ex14_16_StrBlob.h 中,我们可以看到关系操作符的典型实现:
bool operator==(const StrBlob &lhs, const StrBlob &rhs)
{
return lhs.data == rhs.data;
}
bool operator!=(const StrBlob &lhs, const StrBlob &rhs)
{
return !(lhs == rhs);
}
下标操作符重载
// 在ch14/ex14_26_StrBlob.h中
std::string& operator[](std::size_t n)
{
check(n, "subscript out of range");
return (*data)[n];
}
操作符重载的注意事项
- 保持语义一致性:重载的操作符应该保持与内置操作符相似的行为
- 避免过度使用:只在确实能提高代码可读性时使用
- 考虑性能影响:某些操作符重载可能影响性能
进阶主题:函数对象
函数对象(Function Objects)是重载了函数调用操作符 () 的类对象,它们可以像函数一样被调用。在 ch14/ex14_35.cpp 中,我们可以看到函数对象的实际应用:
class PrintString {
public:
PrintString(std::istream &i = std::cin) : is(i) { }
std::string operator()() const {
std::string str;
std::getline(is, str);
return is ? str : std::string();
}
private:
std::istream &is;
};
总结
C++操作符重载是一项强大的功能,通过为自定义类型定义类似内置类型的操作,可以显著提高代码的可读性和易用性。💪
通过Cpp-Primer第十四章的学习,你将能够:
- 理解操作符重载的基本概念和规则
- 掌握常用操作符的重载实现方法
- 避免常见的操作符重载陷阱
- 编写更加优雅和高效的C++代码
掌握操作符重载,让你的C++编程技能更上一层楼!✨
【免费下载链接】Cpp-Primer C++ Primer 5 answers 项目地址: https://gitcode.com/gh_mirrors/cp/Cpp-Primer
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



