//测试友元的使用(1)
C++编程中如果需要访问非本类的私有成员,那么就需要用到友元。否则私有成员是无法被外部直接访问的,而友元可以被定义为友元函数和友元类,即指定某函数或类直接访问私有类.(友元从某种程度上来说破坏了OOP的数据封装的原则,所以友元要慎用)
友元的使用也非常简单。只需要在引入类中的其他类或函数前面加上关键字friend即可。
例如
class Test
{
private:
friend class XusWorld;
public:
friend void XusWorld();
};
写在private 或 protected 或 public 下的效果相同。
下面看例子:
//测试友元的使用
#include <iostream>
#include <string>
#include <iomanip>
using std::string;
using std::cout;
using std::endl;
using std::setw;
class Tom; //前项声明
class Jerry; //前项声明
void Happy(Tom & tom, Jerry & jerry); //声明友元函数
class Tom
{
private:
string name;
public:
friend class Jerry; //友元类的声明
friend void Happy(Tom &, Jerry &); //友元函数的声明
public:
Tom()
{
name = "LittleTom";
}
Tom(string & name)
{
this -> name = name;
}
};
class Jerry
{
private:
string name;
Tom tom;
int age;
public:
friend void Happy(Tom &, Jerry &);
public:
Jerry(): age(15)
{
name = "LittleJerry";
}
Jerry(string & name)
{
this -> name = name;
}
void showFriendship()
{
cout << "Jerry said "<<tom.name <<" is my friend."<< endl;
}
};
void Happy(Tom & tom, Jerry & jerry)
{
cout << tom.name << " and "<<jerry.name << setw(12)<<"is happy !" << endl;
}
int main()
{
string tomname("Tom"); //初始化两个string类对象。
string jerryname("Jerry"); //
Tom tom( tomname );
Jerry jerry( jerryname );
Happy(tom, jerry); //调用happy函数
jerry.showFriendship (); //调用Jerry类的showFriendShip()函数
return 0;
}
这是一段完整的代码测试了友元类的简单使用。读者也可以尝试自己更改程序内容来体验友元的特性。
友元的注意事项:
1:弄清楚谁是谁的友元?friend class Jerry; 该行代码说明了Jerry是Tom的友元,因此Jerry才能获得访问Tom成员的权限。举个简单的例子,Tom 说 Jerry 是他的朋友, Jerry才能进Tom家里(类体内)吃奶酪(类成员),而不能因为Herry说自己是Tom的友元,就可以进Tom家里大吃大喝,这在逻辑上也是行不通的。友元关系是不可逆的,
2:友元关系是不能传递。
3:友元关系是不能被继承的。
4:慎用友元。
日期 2014/11/13
C++编程中如果需要访问非本类的私有成员,那么就需要用到友元。否则私有成员是无法被外部直接访问的,而友元可以被定义为友元函数和友元类,即指定某函数或类直接访问私有类.(友元从某种程度上来说破坏了OOP的数据封装的原则,所以友元要慎用)
友元的使用也非常简单。只需要在引入类中的其他类或函数前面加上关键字friend即可。
例如
class Test
{
private:
friend class XusWorld;
public:
friend void XusWorld();
};
写在private 或 protected 或 public 下的效果相同。
下面看例子:
//测试友元的使用
#include <iostream>
#include <string>
#include <iomanip>
using std::string;
using std::cout;
using std::endl;
using std::setw;
class Tom; //前项声明
class Jerry; //前项声明
void Happy(Tom & tom, Jerry & jerry); //声明友元函数
class Tom
{
private:
string name;
public:
friend class Jerry; //友元类的声明
friend void Happy(Tom &, Jerry &); //友元函数的声明
public:
Tom()
{
name = "LittleTom";
}
Tom(string & name)
{
this -> name = name;
}
};
class Jerry
{
private:
string name;
Tom tom;
int age;
public:
friend void Happy(Tom &, Jerry &);
public:
Jerry(): age(15)
{
name = "LittleJerry";
}
Jerry(string & name)
{
this -> name = name;
}
void showFriendship()
{
cout << "Jerry said "<<tom.name <<" is my friend."<< endl;
}
};
void Happy(Tom & tom, Jerry & jerry)
{
cout << tom.name << " and "<<jerry.name << setw(12)<<"is happy !" << endl;
}
int main()
{
string tomname("Tom"); //初始化两个string类对象。
string jerryname("Jerry"); //
Tom tom( tomname );
Jerry jerry( jerryname );
Happy(tom, jerry); //调用happy函数
jerry.showFriendship (); //调用Jerry类的showFriendShip()函数
return 0;
}
这是一段完整的代码测试了友元类的简单使用。读者也可以尝试自己更改程序内容来体验友元的特性。
友元的注意事项:
1:弄清楚谁是谁的友元?friend class Jerry; 该行代码说明了Jerry是Tom的友元,因此Jerry才能获得访问Tom成员的权限。举个简单的例子,Tom 说 Jerry 是他的朋友, Jerry才能进Tom家里(类体内)吃奶酪(类成员),而不能因为Herry说自己是Tom的友元,就可以进Tom家里大吃大喝,这在逻辑上也是行不通的。友元关系是不可逆的,
2:友元关系是不能传递。
3:友元关系是不能被继承的。
4:慎用友元。
日期 2014/11/13