目录
运算符重载
是否重载运算符,取决于这个运算符对这个类是否有意义
一般写成成员函数,因为使用起来会更加方便,类里面可以直接运用私有
自定义类型运算符重载本质上就是调用函数
引用的底层是使用指针实现,所以在汇编代码里需要取地址
C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其
注意:
几个不能重载的运算符
?: 三目
:: 域作用限定运算符
sizeof
. 成员访问
.* 点心
对象的传值要调用拷贝构造
赋值运算符重载
与拷贝构造函数的区别
拷贝构造是用一个已经存在的对象初始化另一个对象。--构造函数
赋值运算符是已经存在的两个对象之间的复制拷贝。--运算符重载函数
赋值运算符不写会自己生成,其它运算符不会
//传值返回要去调用拷贝构造函数,因此在这里因为this指针里面的内容出了作用域还在,那么使用传引用返回
//这里一个传的是地址,指针是内置类型,一个是别名,所以不要调用拷贝构造
/*date operator=(const date& d)
{
_year = d._year;
_month = d._month;
_day = d._day;
return *this;
}*/
date& operator=(const date& d)
{
//if(*this!=d),也可以这样写,但是!=要进行运算符重载,代价太大
if(this!=&d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
return *this;
}
传值返回
传引用返回
默认生成赋值重载跟拷贝行为一样:
1.内置类型成员——值拷贝/浅拷贝
2.自定义类型成员会去调用他的赋值重载
因为赋值运算符重载是默认成员函数,可以声明和定义分离,但不能声明和定义全写在类外面,不然在类里面又会生成一个默认成员函数,导致无法区分
日期类
类里面的直接是内联(由编译器判断)
左操作数是第一个参数,右操作数是第二个参数
四年一闰,百年不闰,四百年闰
内置类型没有必要用引用返回
cmp比较指令
abs绝对值
自定义类型尽量多用前置,少用后置(后置需要拷贝);
内置类型区别不大
<<流插入重载
可以直接支持内置类型在库里面实现了
可以直接支持自动识别类型是因为函数重载
<<流插入不能写成成员函数
因为Date对象默认占用第一个参数,就是做左操作数
写出来就是下面这样子,不符合使用习惯
void operator<<(ostream& out)
d1<<out 正确
cout<<d1错误
d1.operator<<(cout) 正确
但是如果写成全局函数,成员变量是私有的,无法访问,怎么办?
可以写成员函数Getyear()获取私有变量函数;
写成全局加友元,在类里面写friend +函数声明
ostream前不能加上const,因为流插入,就是往cout里面写东西,需要改变
但是这里还有一个问题就是不能连续流插入?
那么就要有返回值,ostream&
连续赋值
从右往左执行
date d1;
d1=d2=d3;
连续流插入
从左往右执行
cout<<d1<<d2<<d3;
为什么cout不能做第一个参数,成为this指针?
cout.operator(d);不能这样写
友元函数声明
可以写在类里的任意位置
friend+函数声明
可以在类外面访问私有成员变量
>>流提取重载
istream& operator>>(istream& in,Date& d)
在istream前也不能加const,因为提取时,在内部可能会发生改变
流一切皆可输入,输出
const
因为this指针不能显示写,所以在类里面的函数声明后加const修饰*this
void printf() const;
成员函数后面加const以后
普通和const对象都可以调用
要修改的对象成员变量的函数不能加
只要成员函数内部不修改成员变量,都加这个const
普通和const对象都可以调用
声明和定义分离的话,都要在后面加const