C++ 基础语法&特性(6)-面向对象之运算符重载
运算符重载,简直使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 | 长度运算 |
?: | 条件运算符 |
# | 预处理 |
欢迎各位指点!