首页 > 编程语言 >C++运算符重载

C++运算符重载

时间:2023-07-29 23:34:00浏览次数:34  
标签:const Point brand C++ 运算符 operator Computer 重载

1. 概念

赋予运算符更多的功能。

2. 内容

  • 赋值运算符
  • + - * / % 运算符
  • 自增自减运算符
  • 输出流运算符的重载 <<
  • 输入流运算符的重载 >>
  • 函数调用运算符 ()
  • 下标运算符 []
  • 成员访问运算符 ->, *

3. 赋值运算符

这个一般是用已存在的对象赋值给另一个已存在的对象。

//如存在 Computer 类。
Computer pc1("xiaomi",1000);
Computer pc2("huawei",2000);
pc2 = pc1; // 表示将 pc1 的 值赋给 pc2。
// 如果p2不存在,则,Computer pc2 = pc1; 则会调用拷贝运算符。

四点要素:

  1. 自身判断
  2. 释放之前的内存
  3. 深拷贝
  4. 返回*this
    Computer &operator=(const Computer &rhs) {
        if (this != &rhs) {
            delete[] _brand;
            _brand = new char[strlen(rhs._brand) + 1]();
            _price = rhs._price;
        }
        return *this;
    }

4. + - * / %

双目运算符,可使用普通函数的形式, 成员函数或友员函数。

此处使用友员函数。

friend Point operator+(const Point &lhs, const Point &rhs);

Point operator+(const Point &lhs, const Point &rhs) {
    cout << "Point operator+(const Point&, const Point&)" << endl;
    return Point(lhs._ix + rhs._ix, lhs._iy + rhs._iy);
}

- * / % +是类似的。

5. 自增自减

前置和后置是不同的,

前置返回自身,表达式更新为++或--后的值。

后置返回右值,表达式为之前的值。

//前置:
Point &operator++() {
    ++_ix;
    ++_iy;
    return *this;
}   

//后置:返回不是 &,为了返回临时变量, int参数是为了区分前置和后置。
Point operator++(int) {
    Point tmp(_ix, _iy);
    ++_ix;
    ++_iy;
    return tmp;
} 

6. 输出流运算符 <<

只能用友元函数。

因为要访问类内部成员,所以只有友元和成员。

成员则多一个 this ,不符合运算符重载的规则。

流没用拷贝构造和=,只能使用引用。

 friend ostream &operator<<(ostream &os, const Point &rhs); 

//const 为了能够接收右值,& 少一次拷贝构造。
ostream &operator<<(ostream &os, const Point &rhs) {
    os << "(" << rhs._ix << "," << rhs._iy << ")" << endl; 
    return os; 
}     

未完待续....

代码

Point.cc

#include <iostream>
#include <ostream>
using std::cout;
using std::endl;
using std::ostream;

class Point {
public:
    Point() {
    }

    Point(int ix, int iy)
        : _ix(ix)
        , _iy(iy) {
        cout << "Point(int, int)" << endl;
    }

    Point(const Point &rhs)
        : _ix(rhs._ix)
        , _iy(rhs._iy) {
        cout << "Point(const Point&)" << endl;
    }

    Point &operator=(const Point &rhs) {
        cout << "Point& operator=(const Point&)" << endl;
        if (this != &rhs) {
            _ix = rhs._ix;
            _iy = rhs._iy;
        }
        return *this;
    }

    Point &operator++() {
        ++_ix;
        ++_iy;
        return *this;
    }

    Point operator++(int) {
        Point tmp(_ix, _iy);
        ++_ix;
        ++_iy;
        return tmp;
    }

    friend Point operator+(const Point &lhs, const Point &rhs);
    friend ostream &operator<<(ostream &os, const Point &rhs);

private:
    int _ix;
    int _iy;
};

Point operator+(const Point &lhs, const Point &rhs) {
    cout << "Point operator+(const Point&, const Point&)" << endl;
    return Point(lhs._ix + rhs._ix, lhs._iy + rhs._iy);
}

ostream &operator<<(ostream &os, const Point &rhs) {
    os << "(" << rhs._ix << "," << rhs._iy << ")" << endl;
    return os;
}

void test0() {
}

int main(int argc, char *argv[]) {
    test0();
    cout << endl;
    return 0;
}

Computer.cc

#include <iostream>
using std::cout;
using std::endl;

class Computer {
public:
    Computer() {
    }

    Computer(const char *brand, double price)
        : _brand(new char[strlen(brand) + 1]())
        , _price(price) {
        cout << "Computer(const char*, double)" << endl;
        strcpy(_brand, brand);
    }

    Computer(const Computer &rhs)
        : _brand(new char[strlen(rhs._brand) + 1]())
        , _price(rhs._price) {
        cout << "Computer(const Computer&)" << endl;
        strcpy(_brand, rhs._brand);
    }

    Computer &operator=(const Computer &rhs) {
        if (this != &rhs) {
            delete[] _brand;
            _brand = new char[strlen(rhs._brand) + 1]();
            _price = rhs._price;
        }
        return *this;
    }

private:
    char *_brand;
    double _price;
};

void test0() {
}

int main(int argc, char *argv[]) {
    test0();
    cout << endl;
    return 0;
}

标签:const,Point,brand,C++,运算符,operator,Computer,重载
From: https://www.cnblogs.com/zxinlog/p/17590775.html

相关文章

  • C++中fork函数的使用及原理
    C++中fork函数的使用及原理,在C++中,fork函数用于创建一个新的进程称为子进程,该进程与原始进程几乎完全相同。fork函数的基本概况fork()函数调用成功之后,会有两个返回值。当前进程,也就是父进程返回子进程的pid,子进程返回0。如果函数调用错误,返回为-1。#include<stdio.h>#include......
  • C++中的exec()函数
    exec()函数在C++中是一个进程控制函数,用于创建新进程执行其他程序或命令行指令。exec()函数可以替换当前进程的代码和数据,创建新的进程运行其他程序。exec()函数有多个版本,例如execl、execv、execle、execve等,根据不同的参数类型和个数来使用。前言fork函数之后,如果想要把子进程换......
  • C++实现简单的ls命令以及原理
    C++实现简单的ls命令及其原理,C++实现ls命令可通过调用系统函数实现读取目录中的文件名和属性,再通过标准输出进行显示。对控制参数的处理一共有7个可选参数,分别是-a、-l、-R、-t、-r、-i、-s,这些参数可以相互自由组合,因此可以设计一种机制,就是直接把它们全部用循环一次性做或运算,......
  • C++实现工资管理中的随机教师信息生成功能
    使用C++实现工资管理中的随机教师信息生成功能,想要做一个教师工资管理系统,就必须得准备好数据,但是这些数据如果用手一行一行地敲,那么工作量是非常大的,因此,我就产生了用C语言实现直接生成大量的教师基本信息的想法,需要的朋友可以参考下。教师的基本信息typedefstructteacher{......
  • 笔记|《面向对象编程技术与方法(C++)》电子工业出版社
    第一章概述C++多态:https://blog.csdn.net/K346K346/article/details/82774937第二章编程基础数据类型枚举:https://www.runoob.com/w3cnote/cpp-enum-intro.html联合:https://www.runoob.com/cprogramming/c-unions.html作用域运算符:c++入门学习篇(1)之::作用域符解析c++条......
  • Java学习-2.简介、关键字、标识符、变量、数据类型、运算符
    一、Java简介Java最早是由SUN公司(已被Oracle收购)的詹姆斯·高斯林(高司令,人称Java之父)在上个世纪90年代初开发的一种编程语言,最初被命名为Oak,目标是针对小型家电设备的嵌入式应用,结果市场没啥反响。谁料到互联网的崛起,让Oak重新焕发了生机,于是SUN公司改造了Oak,在1995年以Java的名......
  • 基于C++11的轻量级网络框架-实现大并发网络IO
    完整资料进入【数字空间】查看——搜索"writebug"项目特点基于C++11开发,避免使用裸指针,代码稳定可靠;同时跨平台移植简单方便,代码清晰简洁。使用epoll+线程池+异步网络IO模式开发,并发性能优越。代码经过大量的稳定性、性能测试,可满足商用服务器项目。支持linux、macos、ios、android......
  • 生命游戏C++实现
    完整资料进入【数字空间】查看——搜索"writebug"生命游戏,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。给定一个包含m×n个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1即为活细胞(live),或0即为死细胞(dead)。每个细胞与其八个相邻位置......
  • c++字符串搜索之KMP
    classSolution{private:voidgetNext(int*arr,stringstr){intlen=str.length();arr[0]=0;intj=0;for(inti=1;i<len;i++){while(j>0&&str[i]!=str[j]){......
  • day3c++学习
    1内存分区模型C++程序在执行时,将内存大方向划分为4个区域代码区:存放函数体的二进制代码,由操作系统进行管理的全局区:存放全局变量和静态变量以及常量栈区:由编译器自动分配释放,存放函数的参数值,局部变量等堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收......