【c++自学笔记03】
//2-4 操作符重载------operator
// 并不是所有操作符都可以重载
//例
#include "iostream"
using namespace std;
struct comp //定义复数的结构体
{
double real;
double image;
};
comp operator+(comp one,comp another) //重载comp的 + 法
{
one.real+=another.real;
one.image+=another.image;
return one;
}
comp add(comp one,comp another) //重载comp的 + 法
{
one.real+=another.real;
one.image+=another.image;
return one;
}
int main(int argc, char const *argv[])
{
/* code */
comp a,b,c;
a.real=1;
a.image=2;
b.real=3;
b.image=4;
c=a+b; //等价 a=1+2i b=3+4i c=a+b=4+6i 虚部相加,实部相加
cout<<"c=a+b;\t\t"<<"c.real="<<c.real<<"\tc.image="<<c.image<<endl;
// 运算符重载的本质是函数调用 下面可以实现一样的效果
c=add(a,b);
cout<<"c=add(a,b)\t"<<"c.real="<<c.real<<"\tc.image="<<c.image<<endl;
return 0;
}
输出结果如下
c=a+b; c.real=4 c.image=6
c=a+b; c.real=4 c.image=6
c=add(a,b) c.real=4 c.image=6
#笔记#// 2-5 默认参数---表面意思就是在函数定义时给形参一个默认值,如果这个形参没有传入对应的实参值,那么它则使用默认值
#include "iostream"
using namespace std;
//默认规则1:从右往左默认,中间不能跳跃
void fun1(int a,int b,int c=3) //我们只能给c设置默认值,或者b和c同时设置默认值,或者a,b,c都同时设置默认值
{
cout<<a<<b<<c<<endl;
}
/*
下面都是错误的函数定义
void fun1(int a=1,int b,int c) //没有从右往左
{
cout<<a<<b<<c<<endl;
}
void fun1(int a=1,int b,int c=3) //中间跳跃
{
cout<<a<<b<<c<<endl;
}
*/
// 默认规则2:函数声明和定义一体时,默认参数在定义(声明)处,声明在前,定义在后时,默认参数在声明处
void fun2(int a=1,int b=2,int c=3); //这是一个函数声明,这个函数的定义在后面,所以默认参数要在声明处
//默认规则3:一个函数不能既作重载又作默认参数,当你少些一个参数的时候,会参数二义性
// 例如
void fun3(int a,int b,int c=3)
{
cout<<a*b*c<<endl;
}
void fun3(int a,int b)
{
cout<<a+b<<endl;
}
// 对于上面的两个函数,当调用传递两个实参的时候,系统就不知道该调用哪个函数,产生二义性
int main(int argc, char const *argv[])
{
/* code */
// 对于规则
fun1(1,2);
fun2();
return 0;
}
void fun2(int a,int b,int c) //这个时候要注意,当声明和定义不在一起的时候,定义的时候不能写默认参数,定义的时候不能写默认参数,定义的时候不能写默认参数,
{
cout<<a+b+c<<endl;
}
