C++ 操作重载与类型转换(一)https://developer.aliyun.com/article/1437367
标准库定义的函数对象
标准库中提供了许多预定义的函数对象,如 std::plus、std::minus 等,这些都是重载了函数调用运算符的类。
示例:
std::plus<int> add; std::cout << add(3, 4); // 输出 7
在这个例子中,我们使用了标准库中的 std::plus 类来进行加法操作。
可调用对象与 std::function
std::function 是一个模板类,它可以包裹任何可调用对象,比如普通函数、Lambda表达式、函数对象等。
示例:
std::function<int(int, int)> add = [](int a, int b) { return a + b; }; std::cout << add(3, 4); // 输出 7
在这个例子中,使用 std::function 来存储一个Lambda表达式。
注意事项:
- 通过重载函数调用运算符,可以让对象行为类似于函数。
- Lambda表达式和 std::function 提供了灵活的方式来处理可调用对象。
重载、类型转换与运算符
在C++中,除了重载常用的算术和逻辑运算符外,还可以重载类型转换运算符。这使得我们可以定义对象如何从一种类型转换为另一种类型。
类型转换运算符
类型转换运算符用于将一个对象隐式或显式地转换为另一种类型。这些运算符的重载可以提供更多的控制,确保类型转换按预期进行。
示例:
class MyClass { int value; public: MyClass(int v) : value(v) {} // 转换为int类型的运算符 operator int() const { return value; } };
在这个例子中,MyClass 对象可以隐式地转换为 int 类型。
避免有二义性的类型转换
类型转换应该明确无误。如果一个类提供了多个可能的类型转换,可能会导致二义性,这应该尽量避免。
函数匹配与重载运算符
在重载运算符时,应该注意函数匹配的问题。重载应该清晰而明确,不应该引起调用者的困惑或误解。
注意事项:
- 类型转换运算符应该谨慎使用,以避免引入错误或二义性。
- 显式关键字(explicit)可以用来防止隐式类型转换,确保转换行为明确。
- 重载运算符应该保持一致性和直观性,避免过度使用导致代码难以理解。