当前位置: 首页 > news >正文

建站平台 iis厦门电信网站备案

建站平台 iis,厦门电信网站备案,今网科技网站建设,网页设计师是前端吗一、引言 在C中,友元函数(Friend Function)是一个独特而强大的特性,它打破了类的封装性,允许一个或多个非成员函数访问类的私有(private)和保护(protected)成员。尽管这…

一、引言

在C++中,友元函数(Friend Function)是一个独特而强大的特性,它打破了类的封装性,允许一个或多个非成员函数访问类的私有(private)和保护(protected)成员。尽管这种特性在某些情况下可能引发争议,因为它违反了面向对象编程中的封装原则,但在需要高效访问类内部状态或实现某些特定设计时,友元函数却又非常适用。

1.1 封装与友元函数的关系

在面向对象编程(OOP)中,封装是一种将数据(属性)与操作这些数据的函数(方法)绑定在一起的方法。封装的主要目的是隐藏类的内部实现细节,只对外提供有限的接口供外部使用。然而,在某些情况下,我们可能希望允许某些特定的非成员函数访问类的私有成员。这时,友元函数就显得尤为重要了。

1.2 友元函数的概念

友元函数不是类的成员函数,但它可以访问类的所有私有(private)和保护(protected)成员。要使一个函数成为类的友元,需要在类定义中声明该函数为友元。友元函数可以是普通函数,也可以是其他类的成员函数。

二、友元函数的定义与使用

2.1 定义友元函数

在类定义中,使用friend关键字可以声明一个或多个友元函数。友元函数的声明可以放在类的任何位置(但通常放在类定义的开始部分),但它们的定义(实现)必须在类定义之外进行。

示例:

#include <iostream>  class MyClass {  
private:  int value;  public:  MyClass(int val) : value(val) {}  // 声明友元函数  friend void printValue(const MyClass& obj);  
};  // 定义友元函数  
void printValue(const MyClass& obj) {  std::cout << "Value: " << obj.value << std::endl;  
}  int main() {  MyClass myObj(10);  printValue(myObj); // 输出: Value: 10  return 0;  
}

在上面的示例中,printValue函数被声明为MyClass的友元函数,因此它可以访问MyClass对象的私有成员value。

2.2 友元函数的特性

非成员函数:友元函数不是类的成员函数,因此它不会隐式地接收类的this指针。
访问权限:友元函数可以访问类的所有成员,包括私有和保护成员。
作用域:友元函数的作用域不是类的作用域,而是定义它的作用域。但是,它可以通过类的对象来访问类的成员。
数量不限:一个类可以有任意数量的友元函数。
不继承:友元关系不是继承的。如果类B是类A的友元,那么类B的子类不会自动成为类A的友元。

2.3 友元成员函数

除了普通函数外,类的成员函数也可以被声明为其他类的友元函数。这允许一个类的成员函数访问另一个类的私有成员。

示例:

#include <iostream>  class MyClassB; // 前向声明  class MyClassA {  
private:  int value;  public:  MyClassA(int val) : value(val) {}  // 声明MyClassB的成员函数为友元  friend void MyClassB::printValue(const MyClassA& obj);  
};  class MyClassB {  
public:  void printValue(const MyClassA& obj) {  std::cout << "Value from MyClassA: " << obj.value << std::endl;  }  
};  int main() {  MyClassA myObjA(20);  MyClassB myObjB;  myObjB.printValue(myObjA); // 输出: Value from MyClassA: 20  return 0;  
}

注意,在声明友元成员函数时,需要先对目标类进行前向声明,因为编译器在解析MyClassA的类定义时需要知道MyClassB是一个类名。

三、友元函数的使用场景

3.1. 重载操作符

友元函数最常见的用途之一是用于重载操作符,特别是当操作符需要访问类的私有或保护成员时。例如,在自定义的复数类(Complex)中,你可能想要重载<<操作符以便能够直接将复数对象输出到流中。由于输出操作需要访问复数对象的实部和虚部(这些通常是私有成员),因此将<<操作符定义为复数类的友元函数是一个很好的选择。

3.2. 辅助函数

有时,我们可能需要一些辅助函数来帮助实现类的功能,但这些函数并不适合作为类的成员函数。例如,如果有一个表示二维图形的类(如圆形或矩形),我们可能需要一个函数来计算两个图形是否相交。这样的函数可能需要访问图形的私有成员(如中心坐标和半径或边界),但将这些功能作为类的成员函数可能并不合适,因为它们并不是图形对象本身的操作。这时,可以将这些辅助函数声明为类的友元函数。

3.3. 模板类中的友元

在模板类中,友元函数的使用变得更加复杂但也更加有用。模板类的友元可以是另一个模板类或非模板类,甚至可以是模板函数。这允许模板类与非模板代码或不同类型的模板代码之间进行更紧密的交互。例如,你可能有一个模板容器类,并希望提供一个模板化的友元函数来执行某种类型的算法,这个算法需要访问容器的内部数据结构。

3.4. 访问控制绕过

虽然这通常不是推荐的做法,但在某些特殊情况下,友元函数可以用来绕过类的访问控制,以提供对私有成员的访问。这可以在需要优化性能(如避免通过公共接口访问时产生的额外开销)或实现特定设计模式(如访问者模式)时非常有用。然而,过度使用友元可能会破坏封装性,使代码更难理解和维护。

3.5. 跨类访问

友元函数还可以用于实现跨类访问,即一个类的友元函数可以访问另一个类的私有成员。这在设计需要紧密协作的类时特别有用,例如,在某些设计模式(如代理模式或装饰器模式)中,一个类的行为可能依赖于另一个类的内部状态。

http://www.yayakq.cn/news/8640/

相关文章:

  • 一般做平面网站多少钱开发网络新技术的平台
  • 聊城wap网站制作网站页头图片
  • 安徽省建设监理协会网站什么是大型门户网站
  • 网站整体克隆包含后台南昌网络营销网站
  • 十堰最专业的网站建设公司湖北外贸网站建设费用
  • 网站被攻击打不开怎么办开发者工具app安卓版
  • 网站建设制作方式有哪些兰亭集势网站模板
  • 做网站ui主要研究内容网站敏感关键词.txt
  • 深圳网站建设 百业望城经济建设开区门户网站
  • 网站建设要买哪些软件即墨网站建设即墨
  • 如何自己开发一个网站怎么用自己的电脑做网站服务器
  • 园林设计公司网站软件是怎么制作的
  • 做教育培训的网站闵行区网站开发
  • 千万pv网站开发成本中国建筑英才网官网手机版
  • 网页设计与网站开发超链接文交所网站开发
  • 简单html网站模板重庆旅游景点
  • 城市建设管理网站无锡自助网站
  • 长沙开发网站的公司哪家好住房和城乡建设部网站规范答疑
  • 网站买空间郑州妇科医院哪个医院最好
  • 淘宝客手机网站怎么做织梦网站推广插件
  • 东莞服务公司推广seo实战密码第四版pdf
  • 公司网站建设业务文案农村电子商务发展现状
  • 泰安网站建设报价百度指数查询
  • 网站开发 图片存放郑州生活信息网
  • 苏州高端网站建设设计网站建设哪里比较好
  • 创建一个网站的项目体现项目完成速度因素的wordpress 4.9.6 主题
  • 企业网站的建设意义番禺人才市场档案中心
  • 坪山网站建设代理商wordpress ico
  • 网站建设方案书 下载温州市建设工程质量监督站网站
  • 网站用什么颜色建设网站南沙区