zoukankan      html  css  js  c++  java
  • C++ 基础语法&特性(6)-面向对象之运算符重载

    C++相关文章

      运算符重载,简直使C++变成了Python,重载运算符后,对象可进行+-*/=等操作

      系统自动实现的2个运算符重载:

        = 和 &


     class
    类名 { public: 返回值类型 operator 运算符(形参表){ /* 重载运算符函数为类成员 第一个隐含参数永远是本类对象引用(若操作符左侧不是本类对象,则无法实现) ()、[]、->、= 此4个运算符只能重载为成员函数 Tips: =,与复制构造函数易混淆,类类型 变量1=对象2 声明时通过对象进行初始化属于复制构造函数 */ } friend 返回值类型 operator 运算符(形参表){ //重载运算符函数为友元函数,亦可以在外部定义函数体 //比上面函数多一个本类对象引用形参 } /* 简单示例 */ int operator +(int b){ //作为成员函数时,可以满足 对象+数值,但无法满足数值+对象 return this->v + b; } friend int operator +(int b,类名 &对象引用){ //使用友元可实现 数值+对象 return 引用.成员+b; } //流插入和提取运算符,符号左侧为cout或cin,成员函数无法满足 friend ostream &operator << (ostream &output,类名&对象名){ //output 是 cout的别名 output << "输出"; return output; } friend istream &operator >> (istream &input,类名&对象名){ //input 是 cin的别名 input >> 对象.成员; return input; } //重载强制类型转换,无须指定返回类型 //double a=对象+6.0 允许 operator double(){ return doubleValue; } /* 重载自增 */ 类型 & operator++();//默认为前置符号++i 类型 & operator++(int);//增加无用参数,可时实现i++ }; //类体外定义函数体 返回值类型 类名::operator+(形参表){ }

    关于深拷贝和浅拷贝(重载=运算符)

     系统自动重载的=为浅拷贝,当类中有指针时,被重写赋值对象的指针与旧对象指针一致

    对于此情况可改为深度拷贝:
      1.构造和复制构造函数里,为新对象的指针新申请空间并初始化
      2.析构函数里释放指针内存空间
      3.=函数里,释放当前对象的指针的旧空间,重新申请空间

    class A{
        public:
        int *i;
        A(){
            i=new int(100);    //1.构造函数时新申请内存空间 
        }
        A(const A& tmp){
            if(this!=&tmp){    //防止同一个对象复制情况
                i=new int(*tmp.i);    //2.为新对象的指针申请空间 
            }
        } 
        ~A(){
            if(i!=NULL)    delete i;    //3.析构函数里释放空间 
        } 
        A &operator=(const A &tmp){
            if(this==&tmp)return *this;    //防止a=a情况
            delete this->i;    //a=b,最好释放a对象旧的指针空间
            this->i=new int(*tmp.i);    //重新申请空间 
        } 
    } ;
    可重载运算符
    运算符 说明
    +-*/% 双目算术运算符

    ==、!=、<

    >、<=、>=

    关系运算符
    ||,&&,! 逻辑运算符
     +,-,*(指针),&(取址)  单目运算符
     ++,--  自增自减
     |,&,~,^,<<,>>  位运算
     =,+=,-=......  赋值运算符
     new,delete,new[],delete[]  空间申请与释放
     ()函数调用,->成员访问,,逗号,[]下标  其他运算符
    不可重载运算符  
     .  成员访问
     .*,->*  成员指针
     ::  域运算符
     sizeof  长度运算
    ?: 条件运算符
    # 预处理
    欢迎各位指点!
  • 相关阅读:
    gitLab、docker
    Spring源码分析
    Tomcat堆内存分析
    Kafka入门一
    Java NIO
    spring注解
    websocket即时通讯
    pycharm安装dlib库
    python+opencv人脸识别是否戴口罩
    2021年暑假周总结1
  • 原文地址:https://www.cnblogs.com/thors/p/14335217.html
Copyright © 2011-2022 走看看