[OI] 结构体引用类型转换
1.[OI] 树上背包问题2.[OI] 图论3.[OI] 关于最小环和负权环4.[OI] 分层图最短路5.[OI] 关于Eratosthenes筛法的优化思路6.[OI] DP7.[OI] 线段树8.[OI] 扫描线9.[OI] KMP10.[OI] 二分图11.[OI] 平衡树12.[OI] pb_ds13.[OI] Kruskal 重构树14.[OI] 模拟退火15.[OI] 可持久化数据结构16.[OI] Testlib17.[OI] 交互 | pipe18.[OI] 二项式期望 DP19.[OI] 整体二分
20.[OI] 结构体引用类型转换
21.[OI] 猫树22.[OI] 树链剖分23.Borůvka 算法24.线段树分治25.C++ 编译静态链接 (-static)你现在有一个结构体
struct cth{
int rp=0;
};
如果你需要输出 cth.rp
,则需要通过访问其成员函数来得到
cth a;
cout<<cth.rp<<endl;
但注意到该结构体里只有一个变量,有时候为了简化引用过程,或者是有此方面的需要的时候,我们可以通过若干方法将其简化成如下这样:
cth a;
cout<<cth<<endl;
重载隐式转换函数
隐式转换函数形如下面这样:
operator typename (){
}
其中 typename 是需要你填入的返回值类型
在你重载了此类函数后(一般推荐只重载一个,否则编译器推导出错时会很麻烦),在结构体外引用结构体,会直接返回你在隐式转换函数里返回的值,比如
#include<bits/stdc++.h>
using namespace std;
struct cth{
int rp=0;
operator int(){
return rp;
}
};
int main(){
cth a;
a+1;
cout<<a<<endl;
}
在这里 a
就会被直接转换成 cth.rp
,但是这样的方法不支持进行形如 a++
的修改操作
显式类型转换
如果你不希望类型转换是隐式的,可以使用 explicit 关键字来防止隐式转换,从而使类型转换只在显式调用时生效。
示例:
#include <iostream>
class MyClass{
public:
MyClass(int v) : value(v) {}
// 使用 explicit 来防止隐式转换
explicit operator int() const {
return value;
}
private:
int value;
};
int main(){
MyClass obj(42);
// 需要显式转换为 int
int x=static_cast<int>(obj);
cout<<x<<endl;
//直接输出会报错,需要强制转换
cout <<static_cast<int>(obj)<<endl;
}
这里,使用 explicit 关键字防止了隐式转换,你必须使用 static_cast 来将类对象转换为 int 类型。
重载 operator ()
重载括号运算符也是一个不错的选择
#include<bits/stdc++.h>
using namespace std;
struct cth{
int rp=0;
int& operator ()(){
return rp;
}
};
int main(){
cth a;
a()--;
cout<<a()<<endl;
}
重载括号运算符之后,你可以通过在类型后面直接加括号来引用内部成员,这样做虽然更麻烦,但是能更方便地使用 a()--
这样的操作
直接重载对应函数
这是使用最多的一种方法,但是无疑更麻烦
你可以直接重载 ostream& operator <<() 之类的函数来实现 cin cout
比较经典的一种是迭代器的引用实现
T operator*(){
return *iter;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!