c++学习记录(十)
友元
友元分为友元函数和友元类两种
- 友元函数
- 一个类的友元函数可以访问该类的私有成员
- 注意:友元函数不是这个类的成员函数
- 格式
1.声明全局函数为友元函数
friend 返回值类型 函数名(参数);
2.声明其他类的成员函数为友元函数
friend 返回值类型 类名::函数名(参数);
- 可以把一个类的成员函数(包括构造、析构函数)说明为另一个类的友元
- 友元类
- 如果A是B的友元类,那么A的成员函数可以访问B的私有成员
class CCar
{
private:
int price;
friend class CDrive;//声明CDriver为友元类
};
class CDriver
{
public:
CCar myCar;
void ModifyCar(){//改装汽车
myCar.price+=1000;//因CDriver是CCar的友元类,故此处可以访问其私有成员
};
int main(){return 0;}
- 友元类之间的关系不能传递,不能传承
运算符重载
- 基本概念
- 将运算符的功能扩展,使之还可以用于对象间的运算
- 运算符重载,就是对已有的运算符(c++中预定义的运算符)赋予多重的含义,使同一运算符作用于不同类型的数据时,有不同类型的行为
- 运算符重载的目的是:拓展c++中提供的运算符的适用范围
- 同一个运算符,对不同类型的操作数,所发生的行为不同
complex_a+complex_b
生成新的复数对象5+4=9
- 运算符重载的形式
- 运算符重载的实质是函数重载
- 可以重载为普通函数,也可以重载为成员函数
- 把含运算符的表达式转换成对运算符函数的调用
- 把运算符的操作数转换成运算符的函数参数
- 运算符可以被多次重载,在被多次重载时,根据实参的类型决定调用哪个运算符函数
- 格式
返回值类型 operator 运算符(形参表)
{
...
}
- 示例
class Complex
{
public:
double real,imag;
Complex (double r=0.0,doublei=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;
}
- 输出
5,5
3,3
- 重载为成员函数时,参数个数为运算符目数减一
- 重载为普通函数时,参数个数为运算符目数