采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可
友元
友元 friend 机制允许一个类授权其他的函数访问它的非公有成员.
友元声明以关键字 friend 开头 ,它只能出现在类的声明中, 它们不受其在类体中的 public private 和
protected 区的影响.
友元分为外部函数友元, 成员函数友元,类友元。
特点
不具有对称性:A 是 B 的友元, 并不意味着 B 是A的友元
不具有传递性:A是B的友元, B是C的友元, 但A不是C的友元。
不具有继承性: Base 类型继承 Object类型, 如果Object 类型是A的友元,但Base类型不是A友元。
外部函数友元
示例
需要在类中进行对其进行声明,则可以访问类的所有成员
class Int
{
int value;
public:
Int(int x = 0):value(x)
{
cout<<"Create Int: "<<this<<endl;
}
~Int(){ cout<<"Destroy Int: "<<this<<endl;}
friend void Print(const Int &it); // 注册为类的友元函数
};
void Print(const Int &it)
{
cout<<it.value<<endl;
}
int main()
{
Int a(10);
Print(a);
return 0;
}成员函数友元
将一个成员函数声明成友元的时,必须要指明该成员函数属于哪个类:
class Object; // 类的声明
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<<"Destroy Int: "<<this<<endl;}
};
class Object
{
public:
void Print(const Int &it)
{
cout<<it.value<<endl;
}
};
int main()
{
Int a(10);
Object obj;
obj.Print(a);
return 0;
}总结
1.友元函数不是类的成员函数,在函数体中访问对象的成员,必须用对象名加运算符“.”加对象成员名。但友元函数可以访问类中的所有成员,一般函数只能访问类中的公有成员。
2.友元函数不受类中的访问权限关键字限制,可以把它放在类的公有、私有、保护部分,但结果一样。
3.某类的友元函数的作用域并非该类作用域。如果该友元函数是另一类的成员函数,则其作用域为另一类的作用域,否则与一般函数相同。
类友元
整个类可以是另一个类的友元。友元类的每个成员函数都是另一个类的友元函数,都可访问另一个
类中的所以成员,共有,保护或私有数据成员
class Object; // 类的声明
class Int
{
friend class Object; // 注册为类友元
private:
int value;
public:
Int(int x = 0):value(x){ cout<<"Create Int: "<<this<<endl;}
~Int(){ cout<<"Destroy Int: "<<this<<endl;}
};
class Object
{
public:
void Print(const Int &it)
{
cout<<it.value<<endl;
}
};
int main()
{
Int a(10);
Object obj;
obj.Print(a);
return 0;
}到此这篇关于C++深入探究友元使用的文章就介绍到这了,更多相关C++友元内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:C++深入探究友元使用
- Easyx实现扫雷游戏 2023-02-06
- C语言手把手带你掌握带头双向循环链表 2023-04-03
- C语言qsort()函数的使用方法详解 2023-04-26
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- Qt计时器使用方法详解 2023-05-30
- ubuntu下C/C++获取剩余内存 2023-09-18
- C++ 数据结构超详细讲解顺序表 2023-03-25
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- C语言详解float类型在内存中的存储方式 2023-03-27
