运算符重载函数作为类成员函数与友元函数
最近在学习C++的基础,简单地记一些笔记。
关于运算符重载函数作为成员函数还是友元函数的注意点:
当运算符重载函数作为类的成员函数时,要求操作数左边必须是一个对象,而函数的参数可以是同类的对象也可以是普通的变量。这要看具体的问题具体分析,比如下面的例子:
//作为类成员函数定义:
Complex operator+(Complex &c1){
return new Complex(this.real+c1.real,this.image+c1.image);
}
//调用:
(1)c3 = c1+c2; 即 c3 = c1.operator+(c2) //正确
(2)c3 = c1+5; 函数原型:Complex operator+(int i){} //正确
(3)c3 = 5+c1; //错误
以上第三种调用方式显然不能利用定义的重载运算符的,这是因为没有办法调用i.operator+(c1)。那么如果想要这么做,只能作为类的非成员函数,而且当要访问的数据为对象的私有成员函数时,则必须声明为类的友元函数。
重载运算符的规则
不允许用户自定义新的运算符,只能对已有的运算符进行重载
重载运算符不允许改变运算符原操作数的个数
重载运算符不能改变运算符的优先级
重载运算符函数不能有默认的参数,会导致参数个数不匹配
重载双目运算符(略:可参照以上的规则直接重载)
重载单目运算符(主要学习一下前置自增和后置自增)
Time Time::operator++(){ //前置自增
if(++sec >= 60){
sec -= 60;
minute ++ ;
}
return *this;
}
Time Time::operator++(int){ //后置自增
Time temp(*this);
sec ++ ;
if(sec >= 60){
sec -= 60;
minute ++ ;
}
return temp;
}
区别:前置自增是返回自加后的自己,而后置自增是先返回未增加前的对象,然后对象再自加
比如:
int main(){
Time t1(34,59),t2;
cout<<"time1 : ";
t1.display();
++t1;
cout<<"time1 : ";
t1.display();
t2 = t1++;
cout<<"time1 : ";
t1.display();
cout<<"time2 : ";
t2.display();
}
输出如下:
time1 : 34:59
++time : 35:0
time1++ : 35:1
t2 : 35:0
重载流插入运算符和流提取运算符
必须声明为该类的友元函数,原型如下:
friend ostream & operator<<(ostream &output,Complex &c);
friend istream & istream>>(istream &input,Complex &c);
完