C++友元入门教程
副标题#e#
在说明什么是友元之前,我们先说明一下为什么需要友元与友元的缺点:
凡是对付普通函数来说,要会见类的掩护成员是不行能的,假如想这么做那么必需把类的成员都生命成为public(共用的),然而这做带来的问题遍是任何外部函数都可以毫无约束的会见它操纵它,c++操作friend修饰符,可以让一些你设定的函数可以或许对这些掩护数据举办操纵,制止把类成员全部配置成public,最大限度的掩护数据成员的安详。
友元可以或许使得普通函数直接会见类的掩护数据,制止了类成员函数的频繁挪用,可以节省处理惩罚器开销,提高措施的效率,但抵牾的是,纵然是最大限度的掩护,同样也粉碎了类的封装特性,这等于友元的缺点,在此刻cpu速度越来越快的本日我们并不推荐利用它,但它作为c++一个须要的常识点,一个完整的构成部门,我们照旧需要接头一下的。
在类里声明一个普通函数,在前面加上friend修饰,那么这个函数就成了该类的友元,可以会见该类的一切成员。
下面我们来看一段代码,看看我们是如何操作友元来会见类的一切成员的。
#include <iostream>
using namespace std;
class Internet
{
public:
Internet(char *name,char *address)
{
strcpy(Internet::name,name);
strcpy(Internet::address,address);
}
friend void ShowN(Internet &obj);//友元函数的声明
public:
char name[20];
char address[20];
};
void ShowN(Internet &obj)//函数界说,不能写成,void Internet::ShowN(Internet &obj)
{
cout<<obj.name<<endl;
}
void main()
{
Internet a("中国软件开拓尝试室","www.cndev-lab.com");
ShowN(a);
cin.get();
}
上面的代码通过友元函数的界说,我们乐成的会见到了a工具的掩护成员name,友元函数并不能看做是类的成员函数,它只是个被声明为类友元的普通函数,所以在类外部函数的界说部门不可以或许写成void Internet::ShowN(Internet &obj),这一点要留意。
#p#副标题#e#
一个普通函数可以是多个类的友元函数,对上面的代码我们举办修改,留意调查变革:
#include <iostream>
using namespace std;
class Country;
class Internet
{
public:
Internet(char *name,char *address)
{
strcpy(Internet::name,name);
strcpy(Internet::address,address);
}
friend void ShowN(Internet &obj,Country &cn);//留意这里
public:
char name[20];
char address[20];
};
class Country
{
public:
Country()
{
strcpy(cname,"中国");
}
friend void ShowN(Internet &obj,Country &cn);//留意这里
protected:
char cname[30];
};
void ShowN(Internet &obj,Country &cn)
{
cout<<cn.cname<<"|"<<obj.name<<endl;
}
void main()
{
Internet a("中国软件开拓尝试室","www.cndev-lab.com");
Country b;
ShowN(a,b);
cin.get();
}
一个类的成员函数函数也可以是另一个类的友元,从而可以使得一个类的成员函数可以操纵另一个类的数据成员,我们在下面的代码中增加一类Country,留意调查:
#include <iostream>
using namespace std;
class Internet;
class Country
{
public:
Country()
{
strcpy(cname,"中国");
}
void Editurl(Internet &temp);//成员函数的声明
protected:
char cname[30];
};
class Internet
{
public:
Internet(char *name,char *address)
{
strcpy(Internet::name,name);
strcpy(Internet::address,address);
}
friend void Country::Editurl(Internet &temp);//友元函数的声明
protected:
char name[20];
char address[20];
};
void Country::Editurl(Internet &temp)//成员函数的外部界说
{
strcpy(temp.address,"edu.cndev-lab.com");
cout<<temp.name<<"|"<<temp.address<<endl;
}
void main()
{
Internet a("中国软件开拓尝试室","www.cndev-lab.com");
Country b;
b.Editurl(a);
cin.get();
}
整个类也可以是另一个类的友元,该友元也可以称做为友类。友类的每个成员函数都可以会见另一个类的所有成员。
示例代码如下:
#include <iostream>
using namespace std;
class Internet;
class Country
{
public:
Country()
{
strcpy(cname,"中国");
}
friend class Internet;//友类的声明
protected:
char cname[30];
};
class Internet
{
public:
Internet(char *name,char *address)
{
strcpy(Internet::name,name);
strcpy(Internet::address,address);
}
void Editcname(Country &temp);
protected:
char name[20];
char address[20];
};
void Internet::Editcname(Country &temp)
{
strcpy(temp.cname,"中华人民共和国");
}
void main()
{
Internet a("中国软件开拓尝试室","www.cndev-lab.com");
Country b;
a.Editcname(b);
cin.get();
}
在上面的代码中我们乐成的通过Internet类Editcname成员函数操纵了Country类的掩护成员cname。
在编程中,我们利用友元的别的一个重要原因是为了利便重载操纵符的利用,这些内容我们将在后头的教程着重接头!