Qt C++ 运算符重载详解

本文详细介绍了C++中的运算符重载,解释了其本质是函数重载,允许对自定义类型使用内置运算符。通过示例展示了如何重载单目和双目运算符,以及成员函数和友元函数两种方式的重载。同时,文中列举了运算符重载的规则,如必须有一个自定义类型的操作对象,不能改变优先级等,并提供了实际的代码示例来说明运算符重载的使用。
摘要由CSDN通过智能技术生成

为什么对运算符重载?

C++中预定义中的运算符的操作对象只限于基本的内置数据类型,但对于我们自定义的类型是没办法操作的,但是在实际开发中,我们要对自定义的类进行类似于内置数据类型的操作运算,这时就需要我们对运算符进行重载,给运算符新的功能,满足实际需求。

C++ 运算符重载的实质?

运算符重载的实质是函数重载或者函数多态,让开发人员用相同的函数名字完成不同的基本操作。运算符函数形式如下:

<返回类型说明符> operator <运算符符号>(<参数表>)

{

     <函数体>

}

找个简单的例子 验证一下:

int operator<<(const int num);//声明

int Widget::operator<<(const int num)//定义
{
    return  num*3;
}

int b = w<<10;//定义
qDebug()<<b;

运算符重载的规则:

(1)为了防止开发人员对标准的内置运算符进行重载,比如你要重载加法(+),把+重载成乘法          (*),当你输入int a ,int b后,会导致重载以后的二义性,因此要重载运算符的操作对象中              必须有 一个自定义的类型。

(2)不能改变运算符的优先级,不能创建新的运算符。

(3)不能进行重载的运算符:成员运算符,作用域运算符,条件运算符,sizeof运算符,typeid         (一个RTTI运算符),const_cast、dynamic_cast、reinterpret_cast、static_cast强制类型转           换运 算符

重载运算符有两种形式?

重载为类的成员函数,或者重载为友元函数(类的非成员函数)

(1)重载为类的成员函数。

#ifndef PERSON_H
#define PERSON_H


class Person
{
public:
    Person();
    Person(int age,int sal);
    int getworkAge();
    int getsalary();
    Person operator*(const int num);
    friend Person operator+(const Person num1,const Person num2)
    {
        Person sum;
        sum.workAge = num1.workAge + num2.workAge;
        sum.salary = num1.salary+num2.salary;
        return sum;
    }
private:
    int workAge;
    int salary;

};

#endif // PERSON_H
#include "person.h"
Person::Person()
{
    workAge = 0;
    salary = 0;
}

Person::Person(int age, int sal)
{
    workAge = age;
    salary = sal;
}

Person Person::operator*(int num)
{
    Person sum;
    sum.workAge=workAge*num;
    sum.salary =salary*num;
    return sum;
}

int Person::getworkAge()
{
    return workAge;
}

int Person::getsalary()
{
    return  salary;
}

结果:

10 15

友元函数:

    friend Person operator+(const Person num1,const Person num2)
    {
        Person sum;
        sum.workAge = num1.workAge + num2.workAge;
        sum.salary = num1.salary+num2.salary;
        return sum;
    }

    Person a1(50,50);
    Person a2(50,50);
    Person a3 = a1+a2;
    qDebug()<<a3.getworkAge()<<a3.getsalary();

结果:

100 100

经验之谈:

一般来说:单目运算符重载为类的成员函数,双目运算符重载为类的友元函数.

双目运算符不能将 = 。 ()【】。-> 重载为类的友元函数。

当最左边的要求为类对象,而右边的是一个内置类型,则要为友元函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值