首页 > 编程语言 >C++入门到放弃(10)——操作符重载:operator

C++入门到放弃(10)——操作符重载:operator

时间:2023-08-07 21:12:44浏览次数:53  
标签:10 return int C++ 重载 test num operator

​1.重载

重载允许创建多个名称相同,但输入不同的函数,这些函数的参数列表不同,可以通过给予不同输入变量调用对应的函数。

函数重载的关键是函数的参数列表。如果两个函数的参数数量和类型相同,同时参数的排列顺序也相同,那么就是同一个函数,不构成重载,它与f返回值和变量名都无关。

void print(const char* str, int width);    //重载1
void print(int i, int width);              //重载2
void print(double d, int width);           //重载3
void print(long l, int width);             //重载4
void print(const char* str);               //重载5

但是,注意以下情况,C++允许对函数末尾的参数,设置初始值,如果出现这种情况,会导致找不到真正的函数实体,报出多个重载函数与参数列表匹配。

void print(const char* str, int width = 0);
void print(const char* str);

 2.operator关键字

C++中存在一种便携式的操作,可以将常用的操作符转化为函数,例如+-*/,通过函数的方式,让类的管理更加方便,具体实现方式为:operator符号

2.1.基本介绍

对于正常情况,一元运算符(具有一个输入)建议作为成员函数,二元运算符(具有二个输入)建议为友元函数。

::    ?    .    .*    sizeof 这些操作符不能重载

=    ()    []    -> 这些操作符不能作为友元重载

<< >> 这些操作符通常建议作为友元重载,否则无法实现流的连续调用。

2.2.= + - * / 重载

= + - * / 重载格式固定,都只能有一个参数,但类型和返回类型可以不确定。

class test {
public:
    test(int i = 0) :m_num(i) {};
    const test& operator+(int i) {
        m_num += i;
        return *this;
    }
    const test& operator+(const test& other) {    //可以使用不同输入
        m_num += other.m_num;
        return *this;
    }
    const test& operator-(int i) {
        m_num -= i;
        return *this;
    }
    const test& operator*(int i) {
        m_num *= i;
        return *this;
    }
    const test& operator/(int i) {
        m_num /= i;
        return *this;
    }
    const test& operator=(const test& other) {
        m_num = other.m_num;
        return *this;
    }
private:
    int m_num;
};
int main() {
    test t(1);
    t = t + 1;    // 1+1=2
    t = t - 3;    // 2-3=-1
    t = t * 4;  // -1*4=-4
    t = t / 2;  // -4/2=-2
    cout << t.getnum() << endl;
    return 0;
}

2.3.++ -- ! 重载

++和--操作符重载,如果存在参数,代表后++,如果没有参数,代表前++。

! 操作符无法加输入。

class test {
public:
    test(int i = 0) :m_num(i) {};
    const test& operator++() {    //前++
        ++m_num;
        return *this;
    }
    const test& operator++(int) {    //后++
        m_num++;
        return *this;
    }
    const test& operator--() {    //前--
        --m_num;
        return *this;
    }
    const test& operator--(int) {    //后+--
        m_num--;
        return *this;
    }
    bool operator!() {
        return true;
    }
private:
    int m_num;
};
int main() {
    test t(1);
    t++;
    ++t;
    t--;
    --t;
    !t;
    return 0;
}

2.4.() [] 重载

() [] 操作符可以增加任意输入,均可以实现重载。

class test {
public:
    test(int i = 0){
        for (int j = 0; j < 10; j++) {
            m_num[j] = i+j;
        }
    };
    int operator[](int i) {
        return m_num[i];
    }
    int operator()(int i) {
        return m_num[i];
    }
    int operator()(int i,int j) {
        return m_num[i]+ m_num[j];
    }
private:
    int m_num[10];
};
int main() {
    test t(0);
    cout << t[1] << endl;
    cout << t(5) << endl;
    cout << t(5,6) << endl;
    return 0;
}

2.5.<< >> 重载

<< >> 操作的目的是,直接调用当前类,来持续的往流上输入,或者持续的从流中输出,为了保证多个流运算符的连接使用,必须使用友元的方式进行重载,并将流作为返回值。

class test {
public:
    test(int i = 0) : m_num(i) {};
    friend ostream& operator<<(ostream& os, const test& t);
    friend istream& operator>>(istream& is, test& t);
private:
    int m_num;
};
ostream& operator<<(ostream& os, const test& t) {
    os << t.m_num;
    return os;
}
istream& operator>>(istream& is, test& t) {
    int i;
    cin >> i;
    t.m_num = i;
    return is;
}
int main() {
    test t1(10);
    test t2(2);
    cout << t1 << t2;
    cin >> t1 >> t2;
    return 0;
}

2.6.-> 指针重载

-> 不允许带输入,也可以不输出指针。

class base {
public:
    void print() {
        cout << "base" << endl;
    }
};

class test {
public:
    base* operator->() {
        return m_base;
    }
private:
    base* m_base;
};
int main() {
    test t1;
    t1->print();
    return 0;
}


标签:10,return,int,C++,重载,test,num,operator
From: https://www.cnblogs.com/wyqmx/p/17612725.html

相关文章

  • Windows c++检测笔记本是否处于睡眠状态
    最近遇到一个问题,程序需要检测电脑是否处于睡眠状态。一开始使用的方式是在WindowProc里监听WM_POWERBROADCAST消息,对PBT_APMSUSPEND``PBT_APMRESUMEAUTOMATIC消息做处理。但是实际测试中发现,这种方法在台式机中运行良好,但是放到笔记本电脑里就不行,系统休眠时监听不到WM_POWERBRO......
  • 100到python练习题(二)
    编写一个程序,判断一个字符串是否是有效的括号序列。defisValidParentheses(s):stack=[]parentheses={')':'(',']':'[','}':'{'}forcharins:ifcharinparentheses.values():stack.a......
  • vc++2008通过paho c语言客户端接入MQTT
    因项目需要,IoT平台需要支持vc++2008接入。因为Paho的c++客户端不支持低版本vc++,所以不得不尝试通过c语言的库实现。类库下载从github下载c语言包。例如:eclipse-paho-mqtt-c-win32-1.3.12.ziphttps://github.com/eclipse/paho.mqtt.c/releases类库整合和配置解压出来的c语言......
  • 质因子分解C++
    1、题目2、AC代码#include<iostream>#include<cmath>usingnamespacestd;constintmaxn=100010;//10的5次方即可boolisPrime(intn){if(n<=1)returnfalse;if(n==2||n==3)returntrue;//特判if(n%6!=1&&n%6!=5)returnfalse;//不在6的倍......
  • 递推算法例题C++
    1、移动路线【题目描述】X桌子上有一个m行n列的方格矩阵,将每个方格用坐标表示,行坐标从下到上依次递增,列坐标从左至右依次递增,左下角方格的坐标为(1,1),则右上角方格的坐标为(m,n)。小明是个调皮的孩子,一天他捉来一只蚂蚁,不小心把蚂蚁的右脚弄伤了,于是蚂蚁只能向上或向右移动。小明......
  • OWASP-Top-10-for-LLMs-2023
    一、LLM01:PromptInjection0x1:攻击原理这通过特殊构造的输入来污染/覆盖prompt提示,以此攻击一个大型语言模型(LLM),使其产生非预期的意外行为。提示注入漏洞(PromptInjectionVulnerability)是指攻击者通过精心构造的输入,操控一个大型语言模型(LLM),使得LLM在不知情的情况下执行攻......
  • P1005 [NOIP2007 提高组] 矩阵取数游戏题解
    题面传送门:P1005[NOIP2007提高组]矩阵取数游戏-洛谷|计算机科学教育新生态(luogu.com.cn)分析题目可知,这道题是一道求最值的问题,第一次看题没有认真读题,以为是每次只在某一行中选一个数,于是想了半天无果。重新读题才发现每次需要每行都取,那么这就很简单了,相当于在每一行......
  • 洛谷 P6010 - [USACO20JAN] Falling Portals P
    先考虑怎么对一组询问求解答案。容易想到一种贪心策略:如果\(a_{q_i}<a_i\),那么我们肯定希望自己能够尽量快地下落,因此如果遇到一个下落速度大于当前世界下落速度的传送门我们肯定就会进那个世界,如此走下去知道能够传送到世界\(q_i\)为止。对于\(a_{q_i}>a_i\)的情况也类似,只......
  • 10 web服务
    web服务有三个角色:服务请求者、服务提供者、服务注册中心(登记服务并对其接口进行描述)。服务注册中心通过UDDI协议进行对服务的查询和发布。服务注册中心相当于生活中的搜索引擎。发现服务使用UDDI协议描述服务用WSDL协议:WSDL就是webService接口对应的WSDL文件,该文件通过xml格......
  • vscode c++食用指南
    准备配置环境为机房的win10.首先你需要下载vscode。可以从官网下载:https://code.visualstudio.com/Download配置编译c++下载完之后安装好,界面全是英文的,正常情况下在一会儿后他会提示你安装中文的扩展,如果没有可以去最左边四个小方块的图标里搜索“Chinese”安装即可。ps:......