你现在有一个结构体
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;
}
标签:类型转换,rp,OI,int,重载,引用,operator,cth,隐式
From: https://www.cnblogs.com/HaneDaCafe/p/18433744