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  长度运算
?: 条件运算符
# 预处理
posted @ 2021-01-27 15:22  寻觅~~  阅读(69)  评论(0编辑  收藏  举报