C++ 友元关系

在C++中,当基类A,给与属性protected限定时,如果想访问该属性,除了继承的子类外,可在A类中声明B类为A的友元:(如13行)
friend class Others;


友元类 friend+class名(不是对象)
使得友元类可以使用该类的
当A类中定义B为A的友元类,则类B可以使用A的方法和属性

#include <iostream>
class Lovers
{
public :
    Lovers(std::string theName);

    void kiss(Lovers *lover);
    void ask(Lovers *lover,std::string something);

protected:
    std::string name;

    friend class Others;
};

class Boyfriend : public Lovers
{
public:
    Boyfriend(std::string theName);
};

class Girlfriend : public Lovers
{
public:
    Girlfriend(std::string theName);
};

class Others
{
public:
    Others(std::string theName);
    void kiss(Lovers *lover);
protected:
    std::string name;
};

Lovers::Lovers(std::string theName)
{
    name = theName;
}
void Lovers::kiss(Lovers *lover)
{
    std::cout<< name <<"亲亲我们的家" << lover->name <<std::endl;
}
void Lovers::ask(Lovers *lover,std::string something)
{
    std::cout << "宝贝儿"<<lover->name << "帮我" <<something <<std::endl;
}

Boyfriend::Boyfriend(std::string theName):Lovers(theName)
{
}
Girlfriend::Girlfriend(std::string theName):Lovers(theName)
{
}

Others::Others(std::string theName)
{
    name = theName;
}
void Others::kiss(Lovers *lover)
{
    std::cout <<name <<"亲一下"<<lover->name <<std::endl;
}

int main()
{
    Boyfriend boyfriend("A君");
    Girlfriend girlfriend("B妞");
    Others others("路人甲");
    girlfriend.kiss(&boyfriend);
    girlfriend.ask(&boyfriend,"洗衣服啦\n");
    std::cout<<"\n 当当当当!路人甲上场\n";
    others.kiss(&girlfriend); //通过kiss方法,访问girlfriend的继承基类Lovers的name
}

运行结果:
B妞亲亲我们的家A君
宝贝儿A君帮我洗衣服啦

当当当当!路人甲上场
路人甲亲一下B妞


友元函数 friend +函数,声明为A的友元函数
则在该函数内部,可以访问类A的私有成员
重载“<<”与+运算符为非成员函数
Complex.h文件

#ifndef  _COMPLEX_H
#define _COMPLEX_H
#include <iostream>
using namespace std;
class Complex
{
public:
    Complex(){}
    Complex(float a,float b)
    {
        real = a;
        imag = b;
    }
    friend Complex  operator+(const Complex &c,const Complex &d);
    friend ostream & operator<<(ostream & out,Complex &c );
private:
    float real;
    float imag;
};
#endif // _COMPLEX_H

main.cpp

#include "Complex.h"
Complex operator+(const Complex &c, const Complex &d)
{
    return Complex(c.real+d.real,c.imag+d.imag);
}
ostream & operator<<(ostream &out,Complex & x)
{
    out<<"("<<x.real<<","<<x.imag<<")";
    return out;
}
int main()
{
    Complex c1(3,4),c2(2,2),c3(1,1);
    c1=c1+c2;
    cout<<c1;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值