[OI] 结构体引用类型转换

你现在有一个结构体

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;
}
posted @ 2024-09-26 17:16  HaneDaniko  阅读(26)  评论(2编辑  收藏  举报