匿名对象
==================================================
1.概念
你创建了对象,但是该对象没有名字
2.实际开发中的作用
第一:匿名对象作为函数的返回值
第二:匿名对象作为函数的实参
运算符重载
==================================================
1.概念
C++提供一种机制,允许程序员扩展运算符号的功能
比如:加法运算--》正常情况只能用于,整数,小数,字符
重载加法运算--》可以实现加法运算作用于猫的对象.....其他你想要使用的场合
2.语法规则
运算符重载的本质:就是一个函数,程序员自定义一个函数,通过该函数实现运算符功能的扩展
返回值类型 operator运算符号(形参)
{
具体代码
}
例如:我想在猫类中重载加法运算--》让两只猫可以年龄相加
int operator+(Cat &other)
{
return this->age+other.age;
}
运算符重载的特点:
特点一:运算符重载,函数名字很奇怪,统一叫做operator运算符号
返回值 operator+(形参)
返回值 operator*(形参)
返回值 operator[](形参)
返回值 operator()(形参)
特点二:运算符重载不要改变运算符的语义(行业潜规则,不是语法要求)
比如:加法运算在我们心目中一般是用来相加,合并
特点三:以下运算符不能重载
?: :: . sizeof
3.运算符重载有两种表现形式
针对猫的对象
问题一:
c1+4; //等价于c1.operator+(4)
4+c1; //尴尬了,写不出来 4.operator+(c1)是错误的
解决方法:
第一种:运算符重载为类的成员函数
第二种:运算符重载为类的友元函数(非成员函数,是个普通函数)
总结:
运算符重载为类的成员函数,默认是可以使用this指针,意味着函数可以少一个参数
运算符重载为类的友元函数,默认是不可以使用this指针,意味着函数需要把所有的参数都写上
绝大部分情况下,你使用两种重载形式都是可以的
结论:如果可以用对象来调用--》你写成成员函数/友元函数都可以
不可以用对象调用--》你只能写成友元函数
问题二:
int result=4+c1;
int operator+(int,Cat &);
Cat c2=4+c1;
Cat operator+(int,Cat &);
4.运算符重载,在等价表示的时候有两种等价形式
比如:c1+c2; //人类思维习惯
等价于:c1.operator+(c2); //此时operator+一定是Cat类的成员函数
等价于:operator+(c1,c2); //此时operator+一定是Cat类的友元函数(普通函数)
比如:4+c1; //人类思维习惯
等价于:operator+(4,c1); //此时operator+一定是Cat类的友元函数(普通函数)
5.重新认识string,cout,cin
(1)string类重载了哪些运算符
string str3=str1+str2; //重载了加法运算
cout<<str1<<endl; //重载<<
cin>>str1; //重载>>
str1[1] //重载[],等价于str1.operator[](1);
(2)ostream类重载了哪些运算符
重载<< (C语言把这个符号叫做左移,C++重载为输出)
//写法一:人类的思维习惯
cout<<a<<b<<endl;
连续输出的原理(跟连续做加法的原理一样--》嵌套)
第一步:先输出a
cout<<a //cout.operator<<(a); 返回cout的引用
第二步:继续输出b
cout引用<<b
第三步:继续输出回车
cout引用<<endl
//写法二:按照函数调用写法
cout.operator<<(a).operator<<(b).operator<<(endl);
(3)istream类重载了哪些运算符
重载>> (C语言把这个符号叫做右移,C++重载为输入)
//写法一:人类的思维习惯
cin>>a>>b;
连续输入的原理(跟连续做加法的原理一样--》嵌套)
第一步:先输入a
cin>>a //cin.operator>>(a); 返回cin的引用
第二步:继续输入b
cin引用>>b
//写法二:按照函数调用写法
cin.operator>>(a).operator>>(b);
6.几种特殊的运算符重载
(1)自增,自减重载
后置的自增: operator++(int) 参数为了跟前置的++区分
前置的自增: operator++()
后置的自减: operator--(int) 参数为了跟前置的--区分
前置的自减: operator--()
(2)输入>>,输出<<重载
练习
==================================================
1.定义矩形类,重载加法运算--》要求
Rect r1(宽,高);
Rect r2=r1+4; //r1+4表示把矩形的宽高都+4,然后赋值给r2
//等价于Rect r2=r1.operator+(4);
思考:
Cat c3=c1+c2; //如何写
Cat c4=c1+c2+c3; //如何写,连续加可以拆分理解
先计算c1+c2 --》结果
在用上一步结果+c3
人类思维习惯
Cat c4=c1+c2+c3;
翻译成函数调用
翻译一:当成类的成员函数
Cat temp=c1.operator+(c2)
Cat c4=temp.operator+(c3)
//合并成一步,了解
c1.operator+(c2).operator+(c3)
翻译二:当成类的友元函数
Cat temp=operator+(c1,c2)
Cat c4=operator+(temp,c3)
//合并成一步,了解
operator+(operator+(c1,c2),c3)
2.猫里面重载++运算符
要求:
Cat c1(5);
Cat c2=c1++; //后置++
Cat c3=++c1; //前置++
3.cout连续输出多只猫的信息
尝试写出cin从键盘获取猫的信息
cin>>c1; //cin.operator>>(c1); //错误的
operator>>(cin,c1); //正确的
练习:
1.如何实现
Cat c5=c1+4+c2+c3+5+c4;
分析思路:
2.定义时间class Time
Time t1(时分秒);
Time t2(时分秒);
Time t3=t1+t2; //秒大于60,分钟大于60 小时>24提醒过了一天