• cpp占位参数在重载运算符中的作用


    1.什么是占位参数?

    void test1(int a, int){
    	/*
    		这里的参数列表中的int就是一个占位参数;
    		占位参数没有参数名,只有一个数据类型,且没办法在函数体中使用;
    		占位参数可以有默认值,当没有默认值时,必须在调用函数时给占位参数传值;
    	*/
    }
    
    void test2(int a, int = 123)
    
    test1(10); //错误调用。占位参数没有默认值,调用时也未传值
    test1(10, 114514);//正确调用
    test2(10); //正确调用
    test2(10, 114514);//正确调用,传进的值(114514)会覆盖默认值(123),但是用不到,没什么意义
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2.占位参数的作用

    下面通过重载自增运算符的前置++和后置++来说明占位参数的用途。

    #include
    using namespace std;
    
    //自定义数据类型
    class MyInteger {
    	//重载左移运算符<<,为了输出自定义数据类型。
    	//声明为友元函数是为了调用自定义数据类型MyInteger的私有成员变量
    	friend ostream& operator<<(ostream& out, MyInteger m_int);
    public:
    	MyInteger(int n=0):m_num(n) {}
    
    	//重载前置++运算符
    	MyInteger& operator++() {
    		++m_num;//m_num++;
    		return *this;
    	}
    
    	//重载后置++运算符
    	/*
    	Q1: 为什么前置++返回的是自定义数据类型的引用,后置++返回的是自定义数据类型?
    		因为要先输出当前值,再返回++后的值,所以返回值类型不能为当前数的引用(当前数的引用是++后的值),
    		只能返回++前的值。后置--一样,所以后置++和--没办法连续进行,比如a++++后,最后a的结果就只加了一次。
    	
    	Q2: 占位参数在这里的作用
    		这里用到了占位参数,用来区分前置++和后置++,这里使用占位参数的是后置++。
    		有的人就问了:凭什么有占位参数的是后置++,前置++不能是有占位参数的吗?
    	答:问得好,能,前置后置二者其一有占位参数就行,主要目的是区分开前置和后置,
    		但最后调用有些区别,后面调用的时候会说。
    	
    	注意:这里只能用int数据类型作占位参数,因为自增和自减操作针对的是整数类型。
    	*/
    	MyInteger operator++(int) {
    		MyInteger tmp = *this;
    		++m_num;//m_num++;
    		return tmp;
    	}
    
    private:
    	int m_num;
    };
    
    //重载左移运算符<<
    ostream& operator<<(ostream& out, MyInteger m_int) {
    	out << m_int.m_num;
    	return out;
    }
    
    int main() {
    	MyInteger m_int1;//默认值为0
    	cout << ++++m_int1 << endl;//2
    	cout << m_int1 << endl;//2
    	cout << m_int1++ << endl;//2
    	cout << m_int1 << endl;//3
    
    	/*
    		上面说到的后置++我加了占位参数,所以这里调用的时候要传一个整型参数
    	*/
    	cout << m_int1.operator++(5646) << endl;
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    3.我的一点理解

    前面提到了占位参数可以区分前置++和后置++,实质上就是可以用来做函数重载。那么,在调用的时候,如果写成++m_int1或者m_int1++的形式,怎么能知道调用的是前置自增还是后置自增呢?首先说明一点,如果直接用m_int1.operator++(5646),那调用的就是后置++(我的上述代码写的是后置++,你也可以改前置++);用m_int1.operator++()调用的就是前置++。

    如果用++m_int1或者m_int1++的形式,前置自增++m_int1调用的是无参重载函数,后置自增调用的是有参(占位参数)重载函数。
    (这是经过实验得出的结论,具体为什么还不是很清楚,欢迎大家指正!)

  • 相关阅读:
    springcloud
    元强化学习 论文理解 MAESN
    百度10年架构师分享的(Java TCP/IP Socket编程开发经验)看完受益匪浅!
    第1章 算法和数据结构
    Jupyter Notebook与Pycharm代码连接Docker容器中的远程服务器运行
    PSO粒子群算法优化FS508E五轴飞行模拟转台技术方案
    k8s初始化pod-pod标签
    【工具软件】mediamtx——网页、vue3项目中播放 rtsp 视频流(支持265转码)
    06 科技英语|控制与优化学科词汇
    设计模式-代理模式
  • 原文地址:https://blog.csdn.net/qq_41356707/article/details/126441828