C++的友元(friend)是个很重要的概念,好些朋友对此却很迷惑,本文将对友元类(friend class)详细讲解,一文搞懂。
友元的特性:
1、使用friend修饰的友元类可以访问本类的私有成员(private)和保护成员(protected)。
2、友元不能传递,简单来说就是:她是我的朋友,他是她的朋友,但他不是我的朋友。
友元实例
大家都知道:正方形(Square)就是长和宽相等的长方形(Rectangle),本例中将以此为例,说明友元类的定义和使用。
源代码,仔细看注释内容:
#include <iostream>
using namespace std;
/**
* 友元类的定义和使用
*/
class Square; //先声明类,再使用
class Rectangle { //定义长方形类Rectangle
int height, width;
public:
int area(){ //计算长方形的面积
return height*width;
}
void convert(const Square& s); //声明成员方法,行尾必须加分号
};
class Square{ //定义正方形类Square
friend class Rectangle; //声明Rectangle是Square的友元类,从而Rectangle类的对象可以访问Square的私有成员side,反过来不行。
int side; //side是私有成员(private)
public:
Square(int x):side(x){} //完整定义了构造函数重载,所以行尾不用加分号
};
//定义Rectangle的成员方法convert()
void Rectangle::convert(const Square& s){ //参数s是Square类型的对象引用
height = s.side; //友元关系,所以可以使用s的私有成员side
width = s.side; //使用s的私有成员side
}
int main(){
Rectangle rect; //定义一个Rectangle类型的对象rect
Square sqr(4); //定义一个Square类型的对象sqr
rect.convert(sqr); //调用rect的convert()方法将sqr正方形转换为等边的长方形
cout << "Area is:" << rect.area() << endl; //调用长方形的面积函数area()计算面积
return 0;
}
特别说明
在本例中,Rectangle是Square的友元类:
1、Rectangle类的对象可以访问Square的私有成员side;
2、反过来则不行,即:Square类的对象不能访问Rectangle对象的私有成员。
编译运行
D:\YcjWork\CppTour>gpp c2002
D:\YcjWork\CppTour>g++ c2002.cpp -o c2002.exe
D:\YcjWork\CppTour>c2002
Area is:16
D:\YcjWork\CppTour>
运行截屏
(全文完)