172210704111-陈国佳总结《2017年12月3日》【连续054】
标题:友元和运算重载符的基本概念;
内容:A.友元(friends):
1)友元函数:一个类的友元函数可以访问该类的私有成员。
class A;
class B{public: void mod1(A*pa)};
class A{private: int p;
friend int mod2(A a);
friend void B::mod1(B*pa); //声明友元
};
void B::mod1(B*pa){}
int mod2(A a){ }
全局函数或一个类的成员函数(包括构造,析构函数)说明另一个类的友元。
2)友元类:如果A是B的友元类,那么A的成员函数可以访问B的私有成员。
class A{private: int a;
friend class B; //声明B为友元类;
};
class B{};
友元类的关系无法传递(朋友的朋友不是朋友),无法继承;
B.运算符重载的基本概念:
为了实现对象之间的运算,C++可以扩展运算符的试用范围;
其实质是函数重载:
把含运算符的表达式转换成对运算符函数的调用,操作数换成函数参数;
返回值类型 operator 运算符 (形参表)
{
}
例:
class Complex
{
public:
double real,imag;
Complex(double r=0.0,double i=0.0):real(r),imag(i){}
Complex operator-(const Complex&c);
};
Complex operator+(const Complex & a,const Complex &b)
{
return Complex(a.real+b.real,a.imag+b.imag); //返回一个临时对象
}
Complex Complex::operator-(const Complex & c)
{
return Complex(real-c.real,imag-c.imag); //返回一个临时对象
}
/* 重载为成员函数时,参数个数为运算符目数减一。
重载为普通函数时,参数个数为运算符数目 */
int main()
{
Complex a(4,4),b(1,1),c;
c=a+b; //c=operator+(a,b);
cout<<c.real<<" "<< c.imag<<endl;
cout<<(a-b).real<<" "<<(a-b).imag<<endl;
//a-b等价于a.operator-(b);
return 0;
}
C.翻了下书,看到了重载限制:
1.重载后的运算符必须至少有一个操作数是用户定义的类型;
2.重载后的运算符与原来的句法规矩一致,且优先级相同;
3.不能创造新运算符;
4.不能重载:sizeof . .* :: ?: typeid const_cast reinterpret_cast static_cast
5.只能通过成员函数重载: = () [] ->
明日计划:赋值运算符的重载;