关键字-friend

友元函数

    如果在本类以外的其它地方定义了一个函数(这个函数可以是不属于任何类的非成员函数,也可以是其它类的成员函数),在类体中用friend对该函数进行声明,此函数就称为本类的友元函数。一个类的友元函数可以访问这个类中的private成员。

1.1将全局函数声明为友元函数

    如果要将一个全局函数(call)声明为本类(Time)的友元函数,则只需要在本类的函数声明部分声明该函数为friend。此时,该函数可以访问本类的private成员。

class Time
{

public:

Time(int=1,int=1,int=1);

friendvoid call(Time &);//声明友元函数

private:

int hour;

int min;

int sec;

};

Time::Time(int h,int m,int s)
{

hour=h;

min=m;

sec=s;

}

void call(Time &t)
{//全局函数,且是Time类的友元函数

cout<<"Call:"<<t.hour<<"-"<<t.min<<"-"<<t.sec<<endl;//访问private成员

}

int main(){

Time t;

call(t);

system("PAUSE");

return EXIT_SUCCESS;

}
1.2友元成员函数

    如果需要将目标类(Time)中的成员函数(call)声明为本类(Date)的友元函数,则需要在本类的函数声明部分声明该函数为friend。此时,该函数可以访问本类的private成员。

class Date; //对Date类的提前引用声明

class Time
{

public:

Time(int=1,int=1,int=1);

void call(Date &);//声明成员函数

private:

int hour;

int min;

int sec;

};

class Date
{

public:

Date(int=1,int=1,int=2008);

friendvoid Time::call(Date&); //声明Time类的call为本类的友元成员函数

private:

int year;

int mon;

int day;

};

Time::Time(int h,int m,int s)
{

hour=h;

min=m;

sec=s;

}

void Time::call(Date &d)
{

cout<<"TIME:"<<hour<<"-"<<min<<"-"<<sec<<endl;

cout<<"DATE:"<<d.mon<<"-"<<d.day<<"-"<<d.year<<endl; //访问Date类的private成员

}

Date::Date(int m,int d,int y)
{

mon=m;

day=d;

year=y;

}

int main()
{

Time t;

Date d;

t.call(d);

system("PAUSE");

return EXIT_SUCCESS;

}

1.4将一个函数声明为多个类的友元函数

    在这种情况下,该函数可以同时访问多个类的private成员。

class Date; //对Date类的提前引用声明

class Time
{

public:

Time(int=1,int=1,int=1);

friendvoid call(Time&,Date&);//声明函数call为本类的友元成员函数

private:

int hour;

int min;

int sec;

};

class Date
{

public:

Date(int=1,int=1,int=2008);

friendvoid call(Time&,Date&); //声明函数call为本类的友元成员函数

private:

int year;

int mon;

int day;

};

Time::Time(int h,int m,int s)
{

hour=h;

min=m;

sec=s;

}

Date::Date(int m,int d,int y)
{

mon=m;

day=d;

year=y;

}

void call(Time &t,Date &d)
{

cout<<"TIME:"<<t.hour<<"-"<<t.min<<"-"<<t.sec<<endl;

cout<<"DATE:"<<d.mon<<"-"<<d.day<<"-"<<d.year<<endl;

}

int main()
{

Time t;

Date d;

call(t,d);

system("PAUSE");

return EXIT_SUCCESS;

}

 

1.5 友元类

    可以将一个类(B)声明为当前类(A)的友元。此时,当前类(A)的友元类(B)中的所有成员函数都是当前类的友元函数,可以访问当前类的private成员。

class Date; //对Date类的提前引用声明

class Time
{

public:

Time(int=1,int=1,int=1);

friendclass Date;//将Date类声明为当前类的友元类

private:

int hour;

int min;

int sec;

};

class Date
{

public:

Date(int=1,int=1,int=2008);

void call_hour(Time&);

void call_min(Time&);

void call_sec(Time&);

private:

int year;

int mon;

int day;

};

Time::Time(int h,int m,int s)
{

hour=h;

min=m;

sec=s;

}

Date::Date(int m,int d,int y)
{

mon=m;

day=d;

year=y;

}

void Date::call_hour(Time &t)
{

cout<<"HOUR:"<<t.hour<<endl;

}

void Date::call_min(Time &t)
{

cout<<"MINUTE:"<<t.min<<endl;

}

void Date::call_sec(Time &t)
{

cout<<"SECOND:"<<t.sec<<endl;

}

int main(){

Time t;

Date d;

d.call_hour(t);

d.call_min(t);

d.call_sec(t);

system("PAUSE");

return EXIT_SUCCESS;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值