操作符(++,+ + 小于号,(),--等)重载

首先给大家分享一个巨牛巨牛的人工智能教程,是我无意中发现的。教程不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈~我正在学习中,觉得太牛了,所以分享给大家!点这里可以跳转到教程

               


1.操作符(+++,+=,小于号等)重载

新建QT项目,编写头文件

#ifndef DIALOG_H#define DIALOG_H#include <QDialog>#include<QLabel>namespace Ui {class Dialog;}//编写自己的Labelclass myLabel{public: //一定要是共有的,才可以被调用    QLabel *ql;     int cx;     int cy;     myLabel()     {         ql=new QLabel("12345") ;         cx=cy=300;         ql->move(cx,cy);//移动位置     }     ~myLabel()     {        delete ql;     }    void  show()    {       ql->show();    }};class Dialog : public QDialog{    Q_OBJECTpublic:    int x;//长,宽    int y;    int cx;//移动到的位置x坐标    int cy;public:    explicit Dialog(QWidget *parent = 0);    //通过友元函数进行重载    friend void operator +=(Dialog &d,myLabel &my);    ~Dialog();    //重载右加号    void operator ++();    void setxy();    void settoxy(int a,int b);    //二元运算符,重载+号    Dialog * operator +(Dialog const &adddata);    //重载等号    Dialog *operator =(Dialog const &setdata);    //重载+=    Dialog *operator +=(int length);    //重载<    bool operator < (Dialog const &data);private:    Ui::Dialog *ui;};#endif // DIALOG_H

编写头文件的实现类

#include "dialog.h"#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :    QDialog(parent),    ui(new Ui::Dialog){    ui->setupUi(this);    x = y = 300;    //将窗口大小固定    this->resize(x,y);    cx = cy = 0;    this->move(cx,cy);}Dialog::~Dialog(){    delete ui;}//重载左加号,语法:括号里面有int,默认后++,没有int,默认前--void Dialog::operator ++(){    this->cx++;    this->cy++;    this->move(cx,cy);}void Dialog::setxy(){    this->resize(x,y);}void Dialog::settoxy(int a,int b){    this->x = a;    this->y = b;}//二元运算符,重载+号Dialog * Dialog::operator +(Dialog const &adddata){    Dialog *p=new Dialog;    p->x=this->x+adddata.x;    p->y=this->y+adddata.y;    return p;}//重载等号Dialog * Dialog::operator =(Dialog const &setdata){    this->x = setdata.x;    this->y = setdata.y;    this->setxy();    return this;}//重载+=,如果+号前的变量和定义的变量类型一致,只需要一个参数Dialog * Dialog::operator +=(int length){    this->x+= length;    this->y+= length;    this->setxy();    return this;}//重载<bool Dialog::operator < (Dialog const &data){    return (this->x * this->y) < (data.x * data.y);}

编写主函数

#include "dialog.h"#include <QApplication>#include <windows.h>#include <QDebug>//在栈上定义一个临时的Dialog,显示,然后休眠2秒钟后消失void add(Dialog &add1,Dialog &add2){    Dialog temp; //栈上,用完了马上回收    temp.x = add1.x + add2.x;    temp.y = add1.y + add2.y;    temp.show();    temp.setxy();    //发现这里在停留2秒钟后,窗口消失了。    Sleep(2000);}//在堆上,只有自己回收才消失Dialog * addX(Dialog &add1,Dialog &add2){    //在堆上创建一个Dialog,只有当自己回收了的时候才会被销毁    Dialog *p = new Dialog;    p->x = add1.x + add2.x;    p->y = add1.y + add2.y;    p->show();    p->setxy();    return p;}//测试方法的方式实现+操作//1.(分为两种情况:1.栈上,2,堆上)//2.通过重载+操作符的方式实现int main1(int argc, char *argv[]){    QApplication a(argc, argv);    Dialog w1;    //不管最终怎样,因为这里使用了w1.show()所以永远有下面窗口    w1.show();    Dialog w2;    //不管最终怎样,因为这里使用了w1.show()所以永远有下面窗口    w2.show();    add(w1,w2);    //下面开始使用在堆上创建窗口的方式演示效果,最后    Dialog *p = addX(w1,w2);    //显示窗口    p->show();    //下面通过重载+号的方式显示窗口    Dialog *p2 = w1 + w2;    p2->setxy();    p2->show();    return a.exec();}//重载右++,因为右边没有参数,所以就不需要带参数int main2(int argc,char *argv[]){    QApplication a(argc,argv);    Dialog w;    w.show();    //将窗口先移动到(0,0)位置    w.move(0,0);    for(int i=0;i<400;i++)    {        //重载左加号,语法:括号里面有int,默认后++,没有int,默认前--        ++w;        Sleep(5);    }    return a.exec();}//>//=//+=//友元重载+=,=不同类的对象的位置,因为这里的泛型是类,所以下面使用classtemplate<class T>void showall(T* myt){    myt->show();}//测试上面的友元函数,测试重载函数,+=重载//友元函数的好处:访问私有变量//如果重载的时候,用到私有变量的时候,不需要友元int main3(int argc,char *argv[]){    QApplication a(argc,argv);    //调用默认的Label,如果只写下面这两句,也会显示一个带有Label的小窗口    QLabel *ql = new QLabel("1234567");    ql->show();    myLabel label1;    showall(&label1);//通过模板的方式实现显示label    //再定义一个Label,验证上面的重载函数    Dialog w1;    //下面传递一个指针    showall(&w1);    return a.exec();}//测试=,+=,<操作符int main(int argc,char *argv[]){    QApplication a(argc,argv);    Dialog w1;    w1.setWindowTitle("w1窗口");    w1.show();    w1.settoxy(400,700);    w1.setxy();    Dialog w2;    w2.setWindowTitle("w2窗口");    w2.show();    w2.settoxy(700,400);    w2.setxy();    //使用重载的=号操作符,运行效果是窗口2的大小和窗口1的大小一样了    //如果下面的这行注释掉,那么就发现两个窗口大小变成一样了。    w1=w2;    w2.show();    Dialog w3;    w3.setWindowTitle("w3窗口");    w3.show();    w3.settoxy(300,1050);    w3.setxy();    w3+=230;    w3.show();    //<重载的是面积比大小    qDebug() << (w1 < w2);    qDebug() << (w2 < w3);    return a.exec();}

2.重载--,()操作符的代码:
头文件:

#ifndef DIALOG_H#define DIALOG_H#include <QDialog>namespace Ui {class Dialog;}class Dialog : public QDialog{    Q_OBJECTpublic:    int x;    int y;    //重载++操作符    void operator ++();    //重载--操作符    void operator --();    //重载()    void operator ()(int num);    //重载+操作符,创建窗口的时候在堆上    Dialog * operator +(Dialog & adddata2);    void setxy(int a,int b)    {        this->x = a;        this->y = b;        this->resize(this->x,this->y);    }public:    explicit Dialog(QWidget *parent = 0);    ~Dialog();private:    Ui::Dialog *ui;};#endif // DIALOG_H

头文件的实现类

#include "dialog.h"#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :    QDialog(parent),    ui(new Ui::Dialog){    ui->setupUi(this);    this->x = 300;    this->y = 400;    this->resize(x,y);}Dialog::~Dialog(){    delete ui;}//重载++操作符void Dialog::operator ++(){    this->x++;    this->y++;    this->resize(x,y);}//重载--操作符void Dialog::operator --(){    this->x--;    this->y--;    this->resize(x,y);}//重载()void Dialog::operator ()(int num){    this->x = num;    this->y = num / 2;    this->resize(x,y);}//重载+操作符,创建窗口的时候在堆上Dialog * Dialog::operator +(Dialog & adddata2){    Dialog  *p=new Dialog;    p->x=this->x+adddata2.x;    p->y=this->x+adddata2.y;    p->resize(p->x,p->y);    p->show();    return p;}

主函数所在类

#include "dialog.h"#include <QApplication>int main(int argc, char *argv[]){    QApplication a(argc, argv);    Dialog w;    w.show();    for(int i = 0;i<800;i++)    {        ++w;    }    for(int i=800;i>0;i++)    {        --w;    }    for(int i = 1000;i>300;i--)    {        w(i);    }    return a.exec();}

3.通过友元的方式重载操作<<>>还有+操作符

#include<iostream>using namespace std;class mycomplex{public: //友元,需要操作类的内部 //ostream,引用标准输入输出流 friend ostream & operator <<(ostream & out, mycomplex & Complex); friend istream & operator >>(istream & in, mycomplex & Complex); friend   mycomplex  operator +(mycomplex adddata1, mycomplex adddata2); friend   mycomplex  operator +(mycomplex adddata1, int x); //友元函数可以处理不同的类型交错 //成员函数不能实现的,友元函数都可以实现 int x; int y;   //x,y坐标 //没有构造无法使用this初始化 mycomplex() {  this->x = 0this->y = 0; } //构造函数重载 mycomplex(int x, int y) :x(x), y(y) { } ~mycomplex() { } void show() std::cout << x << "+" << y << "i" << std::endl; } //重载++操作符 void operator ++() {  this->x++;  this->y++; } //重载--操作符 void operator --(); //重载函数调用运算符,变量名可以当作一个函数调用参数,返回结果 int operator()(int num) cout << num << endlreturn num + num; }protected:private:};void mycomplex::operator--(){ this->x--; this->y--;}//输入输出,cout,屏幕,fout文件ostream & operator <<(ostream & out, mycomplex & Complex){ out << Complex.x << "+" << Complex.y << "i" << std::endl; return out;}istream & operator >>(istream & in, mycomplex & Complex){ cout << "请输入X,Y" << endl; in >> Complex.x >> Complex.y; return in;}mycomplex  operator +(mycomplex adddata1, mycomplex adddata2){ mycomplex temp; temp.x = adddata1.x + adddata2.x; temp.y = adddata1.y + adddata2.y; return temp;}mycomplex operator + (mycomplex adddata1, int x){ mycomplex temp; temp.x = adddata1.x + x; temp.y = adddata1.y + x; return temp;}void main(){ mycomplex my1(7,8),my2(9,10); //my1+my2这里+实现了重载功能,返回的是一个mycomplex对象,其中<<又被重载了 std::cout << my1 + my2 << std::endl; //my1+3这里+实现了重载功能,返回的是一个mycomplex对象,其中<<又被重载了 std::cout << my1 + 3 << std::endl; std::cin.get();}

运行结果:

 

void main(){ mycomplex my1; //>>调用了重载 cin >> my1; cout << my1; //my1++; //左加加,括号中不需要带参数 ++my1; cout << my1; my1--; cout << my1; //下面每行执行的时候分别输出了2行数据。 std::cout << my1(1) << std::endl; std::cout << my1(2) << std::endl; std::cin.get(); std::cin.get();}

运行结果如下:

  

           

浏览人工智能教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值