我们在C++中在进行某些运算符操作时功能更强大,使代码更简洁
一、基础知识
(一)、定义:对已有的运算符赋予多重的含义,使同一运算符作用于不同类型的数据时导致不同类型的行为。
(二)、目的:扩展C++中提供的运算符的适用范围,使之能作用于对象
(三)、
1、运算符重载的实质是函数重载。
2、可以重载为普通函数,也可以重载为成员函数
3、把含运算符的表达式转换成对运算符函数的调用
// 假设+已被重载,返回example类
a+b=>operator(a,b);
a+b=>a.operator(b);
4、把运算符的操作数转换成运算符函数的参数
5、运算符被多次重载时,根据实参的类型决定调用哪个运算符函数
(四)、
返回值类型 operator 运算符(形参表)
{
…
}
(五)、示例
class example
{
public:
int i,j;
example(int i,int j):i(i),j(j){};
example operator+(const example & c);
}
example::example operator+(const example &c)
{
i += c.i;
j += c.j;
return *this;
}
a+b =>a.operator+(b);
重载为成员函数时,参数个数为运算符目数减一
重载为普通函数时,参数个数是运算符目数
二、赋值运算符重载
在编程时有时会用到赋值运算符两边的类型不匹配依然想赋值,如int赋给complex对象(不是类型转换构造函数)或char * 类型的字符串赋值给一个字符串对象,此时就需要重载赋值运算符“=”
注:赋值运算符“=”只能重载为成员函数
demo
class example_str
{
private:
char * str;
public:
example_str(void){str = new char[1];str[0] = 0;}
const char * re_str(void){return str;}
example_str & operator= (const char * s);
~example_str(void){delete [] str;}
};
example_str::example_str & operator=(const char * s)
{
delete [] str; // 清空str
str = new char[strlen(s)+1];
strcpy(str,s);
return * this; // 返回当前对象
}
(一)深拷贝与浅拷贝
浅拷贝:将两个对象的成员指针变量指到同一个区域,会造成内存泄漏。
深拷贝:当一个对象拷贝另一个对象时,会为该对象分配一片区域,将值拷贝过去,不会造成内存泄漏。
当没有
简单说:浅拷贝是指针拷贝,深拷贝是数据拷贝。
注:系统默认的拷贝构造函数就是浅拷贝
demo
example_str & operator=(const example_str& s)
{
if (this == &s)
return *this;
delete [] str;
str = new char[strlen(s.str)+1];
strcpy(str,s.str);
return *this;
}
问:为什么要用example & 而不用void example
答:理论上都可以。但根据运算符重载后,使用方式尽量不变,若重载为void,连续赋值是不行的;若为example类,假设有(a=b)=c,这样赋值a中是b,但是想是c。
三、运算符重载为友元函数:一般情况下,较好的选择是重载为类的成员函数,但有时,成员函数不够用,重载为普通函数,不能访问类的私有成员。
四、运算符重载的实际应用:这个没什么记的,就一个思路吧。就是有一个需求,我们要实现,把需求拆分开,一个很大的需求也是无数小功能组成的。
四、流插入,提取运算符的重载:
在用C++写代码时经常会用cout<<,cin>>;
这些移位运算符通过重载可以实现输出,输入的功能
cout是在iostream这个头文件中定义的ostream类的对象,<<,>>在iostream中进行了重载
五、重载类型转换运算符,自增,自减运算符
1、类型转换运算符,没有参数的重载运算符。
2、自增、自减运算符的重载:这个有前后之分,前置作为一元运算符重载。后置运算符为二元运算符重载,多写一个没用的参数。
例:
example operator++(example & e, int); // 后置
example & operator++(example ) //前置
operator int(){return n;} //**是否有必要明早测试下**
针对上面参数列表内的形参,是否是对象的引用是无所谓的,但是返回是不是引用(明天测试下)
注:类型强制转换运算符被重载时不能写返回值类型,实际上其返回值类型就是该类型强制转换运算符代表的类型。
六、注意事项:
1、C++不允许定义新的运算符
2、重载后的运算符含义应该符合日常习惯
3、运算符重载不改变运算符优先级
4、“. .* :: ?: sizeof”以上运算符无法被重载
5、(),[],->,=运算符重载时,必需声明为累得成员函数。