首页 > 其他分享 >[OI] 结构体引用类型转换

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

时间:2024-09-26 17:13:04浏览次数:6  
标签:类型转换 rp OI int 重载 引用 operator cth 隐式

你现在有一个结构体

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

相关文章

  • NOIP2024集训Day39 DP
    NOIP2024集训Day39DPA.[AGC002F]LeftmostBall反向考虑,从最终状态,倒退它能指向多少种初始状态。dp策略:从左往右放,每次对最左边的一个空位,要么放一个白球,要么放一个有颜色的球,同时把该种颜色剩下的球都放到后面的位置去。具体的:定义\(f_{i,j}\)表示当前有\(i\)个白球......
  • 洛谷每日一题(P1540 [NOIP2010 提高组] 机器翻译)
    原题目链接:P1540[NOIP2010提高组]机器翻译-洛谷|计算机科学教育新生态(luogu.com.cn)原题目截图:思路分析:读懂题意,直接模拟过程即可。这是一道很简单的题目。思路过程很类似模拟页面置换算法中的先进先出(FIFO)策略。因此我们很容易想到,要用队列来实现。下面是......
  • Android热更新实践:Tinker接入指南
    Android热更新实践:Tinker接入指南在Android开发中,热更新是一种非常有用的技术,它允许开发者在不发布新版本的情况下修复bug或更新应用内容。Tinker是腾讯开源的Android热更新框架,它提供了一套完整的热更新解决方案。本文将详细介绍如何将Tinker集成到你的Android项目中。1.准备工作......
  • 洛谷题单指南-分治与倍增-P3517 [POI2011] WYK-Plot
    原题链接:https://www.luogu.com.cn/problem/P3517题意解读:有n个连续的点p1,p2,...,pn,将这n个点分成不超过m堆,每堆点连续,每一堆都缩成一个点qi,要使得原来的点p1~ps距离qi的最大值最小(最相似),求这个相似度,并计算一共分成几堆,以及每堆缩到的点qi的坐标。解题思路:要使得若干点缩到一......
  • 尽显风骚~一文读懂FD-SOI(附高通电源包络芯片QET7100)
    平台君今天要和大家说的是FD-SOI(全称:FullyDepletedSilicon-On-Insulator,全耗尽型绝缘体上硅)。同样是CMOS工艺进入28nm以下所提出的解决方案,与FinFET工艺相比FD-SOI工艺确显暗淡不少。但是怎么说呢,呃……平台君一直觉得FD-SOI自有它的光芒,人家低调并不代表人家没实力。01......
  • SpainOI XXIV
    GYM105325B题目描述有\(N\)个站,站之间有\(M\)条单向道路。一条路径的代价为:令你经过的边权为\(w_1,w_2,\dots,w_k\),则你的代价为\(w_1\cdotk+w_2\cdot(k-1)+\dots+w_k\)。求你从\(0\)到其他点的最少代价。思路令\(dp_{i,u}\)表示还要走\(i\)条边,当前在\(u......
  • Android平台RTMP推送模块的设计意义
    为什么要做RTMP推送RTMP是一种广泛使用的流媒体传输协议,它允许视频和音频数据在互联网上实时、高效地传输。实现RTMP推送功能,主要是为了满足以下需求:实时性要求:RTMP协议具有低延迟的特点,适合用于需要实时交互的场景,如直播、视频会议等。通过RTMP推送,观众可以几乎实时地观看到主播的......
  • uniapp - 详解安卓App打包后使用uni.chooseLocation地址列表一直加载转圈问题,Android
    前言网上的教程都无法解决问题,本文提供强力解决方案。在uni-app安卓App平台端开发中,详解uniApp打包成Android安卓后用chooseLocation打开地图选择位置空白卡住不动问题,选择地址列表什么也没有且一直处于加载状态(永远不会加载出来卡住了),另外点击搜索框后也无法搜索地点......
  • Android 10.0 Launcher3禁止改变density等系统密度导致布局变化hotseat靠右边显示功能
    1.前言在10.0的系统rom定制化开发中,在进行launcher3的定制化功能中,在有些项目修改系统密度density的值,以后导致launcher3的布局变乱,hotseat布局成一行竖屏显示看的很不美观,接下来就看如何分析解析禁止density改变导致布局变动的功能分析2.Launcher3禁止改变density等系统密......
  • 题解:P10104 [GDKOI2023 提高组] 异或图
    \(\text{Link}\)本题属于集合划分容斥,更多关于集合划分容斥的信息可观看详细揭秘:集合划分容斥的容斥系数。题意给定一个\(n\)个点\(m\)条边的图以及一个长为\(n\)的序列\(a_{1\dotsn}\),有一常数\(C\),你需要求出有多少序列\(b_{1\dotsn}\)满足\(0\leb_i\lea_i\)......