c++——友元函数
一、友元函数的定义
友元函数是一种特殊的函数,虽然不是类的成员函数,却能够访问类的私有和保护成员。
即:友元函数是可以访问类的私有成员和保护成员的外部函数。
二、友元函数的声明
友元函数的声明要放在类定义的内部,使用friend关键字进行声明。
三、友元函数的分类
1.外部函数友元
2.成员函数友元
class Int;
class object
{
public:void Print(const Int& it);
};
class Int
{friend void object::Print(const Int& it); //成员函数友元
private:int value;
public:Int(int x = 0) :value(x){cout << "Create Int: " << this<<endl;}~Int(){cout << "Destory Int:" << this << endl;}};
void object::Print(const Int& it)
{cout << it.value << endl;
}int main()
{Int a(10);object obj;obj.Print(a);return 0;
}
3.类友元
整个类可以是另一个类的友元。友元类的每个成员函数都是另一个类的友元函数,都可以访问另一个类中的所有成员(公有、保护、私有等)。
class Int; //先声明Int,因为object类中需要使用Int
class object
{
public:void Print(const Int& it);
};
class Int
{friend class object; //类友元
private:int value;
public:Int(int x = 0) :value(x){cout << "Create Int:" << this << endl;}~Int(){cout << "Destory Int:" << this << endl;}
};
void object::Print(const Int& it)
{cout << it.value << endl;
}
int main()
{Int a(10);object obj;obj.Print(a);return 0;
}
四、友元的特点
1.友元不具有对称性(单向的)
A是B的友元,但B不是A的友元。
2.友元不具有传递性
A是B的友元,B是C的友元,但A不是C的友元。
3.友元不具有继承性
五、注意点
①友元会破坏类的封装特性。
②友元函数不属于类的成员,没有this指针,不能直接调用类的成员函数,必须要通过对象访问成员。
③友元函数的声明不受类中访问权限的控制,可以放在类的公有、保护、私有部分,结果一致。
④友元函数一般用于运算符重载、两个类之间。