C 模板和过载操作员
c++ templates and overloading operators
本文关键字:操作员 更新时间:2023-10-16
我正在尝试了解该程序的工作原理。我是C 模板的新手。有人可以解释为什么我们需要以下功能?
friend std::ostream &operator <<(std::ostream &os, const Temp &temp)
它似乎仅适用于字符串模板。
另外,功能operator T() {return val;}
做什么?
#include <iostream>
#include<string>
template <typename T>
class Temp {
friend std::ostream &operator <<(std::ostream &os, const Temp &temp) {
os << temp.val;
return os;
}
public:
Temp(T val) : val(val) {}
operator T() {return val;}
public:
T val;
};
用法示例:
#include <iostream>
#include<string>
#include "temp2.h"
using namespace std;
int main() {
temp<int> si = 10;
cout << "si: " << si << endl;
si = si + 2;
cout << "After si = si + 2: " << si << endl;
Temp<double> si2 = 15.5;
cout << "si: " << si2 << endl;
si2 = si2 + 2.3;
cout << "After si = si + 2: " << si2 << endl;
Temp<string> ss = string("Hello");
cout << "ss: " << ss << endl;
ss = string(ss).substr(1);
cout << "After ss = si.substr(1): " << ss << endl;
return 0;
}
并不是真的需要操作员<<
,而是在使用输出流时很方便使用它。此外,操作员需要访问温度类的内部值,因此friend
预选赛。没有它,班级将必须以某种方式将内部价值val
暴露于外部世界(通常的方法是仅公开阅读方法),这会引起维护问题,因为该类的未来演变必须继续支持该方法,即使类内部变化。
换句话说,将<<
操作员声明为"同类"的朋友,可以防止实现详细信息泄漏到世界其他地方。
也就是说,t()运算符几乎提供了我上面描述的仅假设读取方法的服务,但是通过复制val
字段来替换读取部分。基本上,这是一个铸件运算符,允许将温度值施加到t值。<<
操作员本可以使用该铸造运算符实施,因此无需朋友预选赛。但是,当然,出于效率问题,保留了朋友预选赛,以避免复制val
的开销。
关于<<
运算符的实现,我们可以看到它依赖于针对t打字机定义的相同操作员。任何具有此操作员定义的类型都应使用此模板而无问题。
相关文章:
- <<操作员在下面的行中工作
- C++ 与操作员不匹配<<
- 操作员C++的模棱两可的过载
- C++中>>操作员过载时出现问题?
- NaN 上的宇宙飞船操作员
- 比根<操作员
- SFINAE不能防止模棱两可的操作员过载吗?
- 什么是现实中的"endl"(或任何输出操纵器)?它是如何实现的,它如何与操作员<<一起工
- 为什么"delete"操作员给我访问权限冲突
- 为什么使操作员成为新的专用会打破 std::shared_ptr?
- 在这种情况下是私有的吗?试图使操作员<<过载
- C++操作员过载>>
- 是否有 C++20 浮点数的包装器,使我能够默认宇宙飞船操作员?
- 与异常处理程序中的操作员<<不匹配
- 复印作业操作员说明
- 友谊和操作员+=重载
- >操作员在比较两个C++容器时会怎么做?
- 与操作员比较两个计时时间点
- C++操作员订单评估
- 如何强制新操作员根据我的需要解释语句