c++ 友元

c++友元
友元有3种:友元函数;友元类;友元成员函数;

一、友元函数
// 友元函数的作用常常是用来重载运算符,如<<
#include "stdafx.h"
class Youyuan
{
private:
int a;
public:
void show(int a);
friend int plus(int a); //友元函数申明在类中,但它不是类的成员函数,但它与成员函数访问权限相同
friend int plus2(int a)//这将是内联函数定义
{
return a+a;
}
operator int() const;   //声明转换函数,不能有参数,不能指定返回类型,用于强制将类转换为数值等
operator double() const;//声明转换函数,可显示强制类型转换
};
Youyuan::operator double() const
{
return a;
}
Youyuan::operator int() const
{
return a;
}
void Youyuan::show(int a)
{
}
int plus(int a)  //在编写函数定义时,不要使用Youyan::因为不是成员函数。
{
return a+a;         
}

二、友元类

如TV类和遥控器类Remote类,他们不是公有继承关系,也不是私有或保护继承关系,但遥控器可以改变TV类,所以,将遥控器类Remote作为TV类的一个友元类。
//下面是友元类的代码演示
class TV
{
public:
friend class Remote;//Remote 能访问TV类的私有部分
bool volup(){volume+=1;return true;};
TV(){volume=0;};
~TV(){};
private:
int volume;
};
class Remote
{
public:
bool volup(TV& t)
{
   t.volup();//Remote通过TV的public方法访问TV类,不是友元也能访问
int x=t.volume; //Remote直接访问TV的私有成员volume,必须是友元才能访问
return true;
}
void show(TV& t){std::cout<< t.volume << std::endl;}
Remote(){};
~Remote(){};
};

三、友元函数
使用友元类时,遥控器类Remote可以访问电视类TV的全部私有变量。如果只让遥控器类的某个函数具有这个权利,则使用友元函数。但必须要先定义Remote类,再定义TV类,而且必须在Remote类前使用前向声明class TV,因为Remote中要提到TV。代码如下:
//下面是友元函数的代码演示
class TV;
class Remote
{
public:


void show(TV& t);
void chang(TV& t);//chang() 方法不能访问TV的私有变量
Remote(){};
~Remote(){};
};
class TV
{
public:
friend void Remote::show(TV& t);//Remote的show方法能访问TV类的私有部分
bool volup();
TV(){volume=0;};
~TV(){};
private:
int volume;
int state;
};
void Remote::show(TV& t)  //Remote的定义必须放在class TV 后面
{std::cout<< t.volume<< std::endl;}






你可能感兴趣的:(C/C++学习,c++,友元)