友元函数是C++中的一个特殊函数,它允许非成员函数访问类的私有和保护成员。友元函数不是类的成员函数,通过友元函数可以实现一些特殊的操作,当这些操作需要访问类的内部数据,但又不想让这些操作为类的成员函数时,可以通过友元函数进行操作。
友元函数的定义:
友元函数是类中声明的非成员函数,通过在类中使用friend关键字进行声明。友元函数虽然可以访问类的私有和保护成员,但不属于类成员函数,因此友元函数不能使用this指针。
Class A{
friend ReturnType FuncName(TypeName);
};
ReturnType FuncName(TypeName){
//行为
return ReturnType;
}
ReturnType是函数的返回类型,FuncName是函数的名字,TypeName是参数列表的名字。
友元函数的特点:
1.非成员:友元函数不是类的成员函数,因此友元函数的语法定义与普通函数相同。
2.访问权限:友元函数可以访问类中的所有成员。
3.声明方式:在类中定义时,通过关键字friend进行声明。
4.类的作用域外:友元函数的定义通常在类的作用域外。
友元函数的三种实现:
1.全局函数做友元:
Class A{
public:
friend void func(A* a);
A(){
this->m_A1="A_A1";
this->m_A2="A_A2";
}
string m_A1;
private:
string m_A2;
};
void func(A* a){
cout<<"func正在访问:"<<a->m_A1<<endl;
cout<<"func正在访问:"<<a->m_A2<<endl;
}
int main(){
A a;
func(&a);
return 0;
}
2.类作为友元函数:
Class A{
public:
A(){
b=new B;
}
void visit(){
cout<<"友元类正在访问:"<<b->m_B1<<endl;
cout<<"友元类正在访问:"<<b->m_B2<<endl;
}
private:
B* b;
};
Class B{
friend Class A;
public:
B(){
this->m_B1="B_B1";
this->m_B2="B_B2";
};
string m_B1;
private:
string m_B2;
};
int main(){
A a;
a.visit();
return 0;
}
3.成员函数做友元:
Class A{
public:
A(){
b=new B;
}
void visit(){
cout<<"visit函数正在访问:"<<b->m_B1<<endl;
cout<<"visit函数正在访问:"<<b->m_B2<<endl;
}
void visit1(){
cout<<"visit1函数正在访问:"<<b->m_B1<<endl;
}
B* b;
};
Class B(){
friend void A::visit();
public:
string m_B1;
B(){
m_B1="B_B1";
m_B2="B_B2";
}
private:
string m_B2;
};
友元函数的优点与局限性:
优点:
1.提高灵活性:
友元函数可以访问类的私有和保护成员,从而实现一些特殊操作。
2.简化代码:
通过友元函数,可以避免类中定义的大量的成员函数。
局限性:
1.破坏了类的封装:
友元函数可以访问类的私有和保护成员,可能会破坏类的封装性,导致类的内部实现暴露。
2.增加了复杂性:
过多使用友元函数会增加代码的复杂性,提高了代码的维护成本。
友元函数的注意事项:
1.友元函数的声明必须在类内。
2.友元函数不可以传递。比如:A类的友元函数,不会自动成为B类的友元。
3.友元函数不享有类的成员函数所具有的一些特权。
4.友元函数可能会破坏类的封装性。
&spm=1001.2101.3001.5002&articleId=147678244&d=1&t=3&u=125bdc262af348ab832fafb0dd819a15)
1万+

被折叠的 条评论
为什么被折叠?



