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
  • 重载为成员函数时,参数个数为运算符目数减一
  • 重载为普通函数时,参数个数为运算符目数
原文地址:https://www.cnblogs.com/2002ljy/p/12271039.html