全局操作符重载
Node z1;
z1 = 2.2 + z1//这里需要全局操作符重载,
全局操作符重载,需要去掉名字空间,并且在参数中按顺序添加所有所需要的参数,例如
class Node{
public:
friend Node operator+(double a,Node z);//声明友元函数,这时候就可以访问z的私有成员了,注意这个函数并不是此类的成员函数
};
Node operator+(double a,Node z){
//代码块,一定要注意,这里不能访问z的私有成员
//解决办法:在类里面声明一个友元函数👆
}
注意:操作符重载必须有一个参数是类类型或者枚举类型,即操作符重载不可以实现两个指针之间的操作,例如指针相加
cout运算重载
cout是ostream类型,
注意:
- 输出操作符重载是全局操作符重载
- 需要在类中添加声明友元函数
- cout是ostream类中已经定义好的对象实例,定义结束后使用的仍然是cout输出
class Node{
private:
int a;
int b;
public:
friend ostream& operator<<(ostream &mycout, Node z);//别忘了声明友元函数
}
//cout << int;cout使用方法
ostream & operator<<(ostream & mycout,Node z) {//固定的,ostream也是一个类,cout就是ostream的一个对象实例;在函数体中,把形参mycout当成cout使用
mycout << "(" << z.a << "+" <<z.b <<"i)";
return mycout;
}//返回的也是ostream引用
//使用输出操作符的重载,仍然是使用的cout,定义时的mycout只是形参,重载不影响其他函数的输出
cout << z << 1.3 << 1;
延申:&是引用
引用&
引用即别名,操纵引用对象可以直接修改原对象
引用对象在创建时必须赋初值
int a = 10;
int& x = a;//把int&看在一起,&出现在此属于标记符
可以在函数中使用
void swap(int &a,int &b){
int tmp = a;
a = b;
b = tmp;
}//因为传入引用值,可以实现a和b原值的改变,改变实参
cin运算重载
cin运算重载和cout类似,但是cin是istream的对象实例,
class Node{
private:
int a,b;
public:
friend istream& operator >> (istream& mycin,Node& z);
}
istream& operator >> (istream& mycin , Node& z){//因为要改变z的值,所以要使用引用
mycin >> z.a >> z.b;
return mycin;
}
int main(){
Node node;
cin >> node;
return 0;
}
z1(z4)
在类的构造函数中传参此类,要加引用
Node(Node & z){
}