C++基础--友元

CCD成像原理以及机器视觉中的相机选型 CCD成像原理以及机器视觉中的相机选型 近年来,随着人工智能的高速发展和图像处理技术的日益成熟,机器视觉在自动化领域发挥着越来越大的作用。机器视觉被用于代替人工视觉,使机器人能够完成以往只有人工才能完成的任务,这大大减少了在危险环境下工作的风险。同时,在来料无序工作环境杂乱的情况下,机器视觉可以显著提高生产效率和自动化柔性程度。随着人们对工业设计水平和生产效率需求的日益提高,机器视觉正在逐步代替传统复杂繁琐的自动化模式,成为当今的主要发展趋势。 机器视觉是一项综合的技术,包括数字图像处理,传感器,光学 阅读详情
C++基础--友元
我们知道:类的公有成员能够在类外访问,私有的成员只能被类的其它成员函数访问。在C++中,可以定义友元,如果某一个函数定义为类的友元,则该函数就可以访问该类的私有成员,下面举例说明友元函数的使用。

假定我们已经定义了两个集合类变量,一个为整型数集合,另一个为实型数集合:
程序段程序段10-7
 

class IntSet {
public: 
 //...
private:
 int elems[maxCard];
 int card;
};

class RealSet {
public: 
 //...
private:
 float elems[maxCard];
 int card;
};

  我们还要定义一个函数SetToReal,其功能是将整型数集合转换为实型数集合。SetToReal可以定义为IntSet类的成员函数。
程序段程序段10-8
 

void IntSet::SetToReal (RealSet &set)
{
 set.EmptySet();
 for (register i = 0; i < card; ++i)
  set.AddElem((float) elems[i]);
}

  这个函数中,整型数集合中的每一个元素作为实参,调用实型数集合中的AddElem成员函数的开销较大。如果我们将SetToReal函数定义为RealSet类的友元,使得SetToReal函数能够访问RealSet类的私有成员,则可提高程序运行的效率。
程序段程序段10-9
 

class RealSet {
 //...
 friend void IntSet::SetToReal (RealSet&);
};

void IntSet::SetToReal (RealSet &set)
{
 set.card = card;
 for (register i = 0; i < card; ++i)
  set.elems[i] = (float) elems[i];
}

  从上面我们可以看出:定义友元需用friend关键字,SetToReal函数定义为类RealSet的友元后,就能够直接访问RealSet类的私有数据成员elems,避免了函数调用的开销,从而提高了程序运行的效率。
其实,我们也可以把一个类定义为另一个类的友元,例如: 
  class A;
  class B {
   //...
   friend class A;
  }; 
  类A是类B的友元,类A中的所有成员函数都能访问类B的私有成员。
  全局函数也可以作为类的友元。例如,假定我们将SetToReal定义为全局函数,并定义为IntSet和RealSet两个类的友元:
程序段程序段10-10
 

class IntSet {
 //...
 friend void SetToReal (IntSet&, RealSet&);
};

class RealSet {
 //...
 friend void SetToReal (IntSet&, RealSet&);
};

void SetToReal (IntSet &iSet, RealSet &rSet)
{
 rSet.card = iSet.card;
 for (int i = 0; i < iSet.card; ++i)
  rSet.elems[i] = (float) iSet.elems[i];
}

  注意:虽然友元定义出现在类内,但它并不是类的成员。友元在类内定义的位置也是任意的,不管是出现在类的private、pretected或public部分,含义均相同。
  虽然友元为我们进行程序设计提供了一定的方便性,但是面向对象的程序设计要求类的接口与类的实现分开,对对象的访问通过其接口函数进行。如果直接访问对象的私有成员,就破坏了面向对象程序的信息隐藏和封装特性,虽然提供了一些方便,但有可能是得不偿失的,所以,我们要慎用友元。

C++的存取控制
  C++有三个关键字,用于设置类成员的访问权限,它们是:public、private和protected。
  ◇ public意味着在其后声明的所有成员在类外可以访问;
  ◇ private关键字则意味着,除了该类的成员函数之外,类外不能访问这些成员。如果试图访问私有成员,就会产生编译错误。类中缺省访问权限说明的的成员声明是private的;
  ◇ protected和private区别在于:protected成员可以被派生类访问,而private成员则不能被派生类访问。
友元的使用
  类的私有成员只能在类内访问,那么有没有可能让类外的成员访问?其实,在C++中,友元可以访问类的私有成员。友元不是类的成员,但必须在类的内部声明。因为"谁是我的朋友"必须由"我自己决定"。绝对不能允许下面的现象发生:李四说,"嘿,我是张三的朋友",然后李四就开始使用张三的一切,包括它的私有财产。李四究竟是不是张三的朋友,必须由张三自己说了算。
  通过friend关键字,可以把一个全局函数声明为友元,也可以把另一个类中的成员函数,甚至整个类都声明为友元,请看下面的例子:
例题例10-25
 

class X; //Declaration
class Y
{
 void f(X*);
};
class X
{
private:
 int i;
public:
 void initialize();
 friend void g(X*, int); //Global friend
 friend void Y::f(X*); //class member friend
 friend class Z; //Entire class is a friend
 friend void h(); 
};
void X::initialize()
{
 i = 0;
}
void g(X* x, int i)
{
 x->i = i;
}
void Y::f(X* x)
{
 x->i = 100;
}
class Z
{
private :
 int j;
public:
 void initialize();
 void g(X* x);
};
void Z::initialize()
{
 j = 99;
}
void Z::g(X* x)
{
 x->i += j;
}
void h()
{
 X x;
 x.i = 200; //直接数据操作
}
void main()
{
 X x;
 Z z;
 z.g(&x);
}

  类Y有一个成员函数f(),它要访问X对象的私有数据成员i,需将Y::f(X*)声明为类X的友元。这里有一个难题,因为C++的编译器要求在使用任一变量之前必须声明,所以,类Y必须在它的成员Y::f(X*)被声明为类X的一个友元之前声明。但声明Y::f(X*)之前,又必须声明类X。
  解决的办法是:首先声明类X,但是这个类X的声明并不完整,能行吗?在本例中是可以的,这是由于Y::f(X*)的参数是指向X对象的指针,所以编译器允许在声明Y::f(X*)之前做一个不完全的类型指定。仅仅是告诉编译器,有一个叫X的类。这样,在类X中,Y::f(X*)就可以成功地声明为一个友元函数。
  再来看看其它两个友元函数,第一个声明将一个全局函数g()作为一个友元,但g()在这之前并没有定义,这表明friend可以同时声明全局函数和友元。同样,friend可以同时声明类Z及类Z作为类Y的友元。

嵌套友元
  对于嵌套类,也不能访问私有成员。嵌套类要访问私有成员也必须定义为友元。请看下面的例子:
例题例10-26
 

#define SZ 20
class holder
{
private:
  int a[SZ];
 public:
  void initialize();
  class pointer
  {
  private:
   holder *h;
   int* p;
  public:
   void initialize(holder* H);
   //move around in the array.
   void next();
   void previous();
   void top();
   void end();
   //access values.
   int read();
   void set(int i);
  };
  friend holder::pointer;
};

  类holder包含一个整型数组和一个嵌套类pointer。通过定义pointer为holder的友元,使得pointer成员可以访问holder类的私有成员:
  friend holder : :pointer ;

关于友元的使用
  如果一个函数被某一个类声明为friend,就意味着它不是这个类的成员函数,但却可以访问该类的私有成员,而且它必须被列在类的定义中。虽然友元这种机制为我们进行程序设计提供了一定的方便性,但是,面向对象的程序设计要求类的接口与类的实现分开,对对象的访问通过其接口函数进行。如果直接访问对象的私有成员,就破坏了面向对象程序的信息隐藏和封装特性,虽然提供了一些方便,但有可能是得不偿失的,所以,我们要慎用友元。 

C++基础-友元 友元 友元不是的成员,但可以访问的任何成员,包括私有成员。 声明友元的外界对象既可以是另一个的成员函数,也可以是不属于任何的一般函数,称为友元函数。也可以是一个,即友元。 一、友元函数 在定义中由关键字friend修饰的非成员函数,不能通过对象调用。格式: friend 返回型 函数名(形参表) { 函数体 } 也可在声明外定义,但外定义时不得指出函数所属的。 例子:计算时间差 #include<iostream> using namespace std; c 阅读详情

相关推荐

YOLOv11改进策略【损失函数篇】| Shape-IoU:考虑边界框形状和尺度的更精确度量

本文记录的是改进YOLOv11的损失函数,将其替换成Shape-IoU。现有边界框回归方法通常考虑与之间的几何关系,通过边界框的相对位置和形状计算损失,但忽略了边界框本身的形状和尺度等固有属性对边界框回归的影响。为了弥补现有研究的不足,Shape-IoU提出了一种关注边界框本身形状和尺度的边界框回归方法。

Limiiiing的博客 4515

友元友元函数

一、友元函数 友元函数和普通函数最大的区别在于友元函数可以直接访问的私有成员和保护成员; 友元函数不属于的成员函数,但是友元函数必须在内部定义; 友元函数使用friend关键词声明友元函数能够实现之间的数据共享,较少系统开销,提高效率,但是会破坏的封装机制; class FriendFunc { public: FriendFunc(); ~FriendFunc(); friend void friend_function(FriendFunc f1); priva

weixin_43743711的博客 1065

16口交换机RTL8316 Cadence ALLEGROL设计硬件原理图PCB++PDF原理图+RTL8316技术手册.zip

16口交换机RTL8316Cadence orcad设计硬件原理图PCB+PDF原理图+RTL8316技术手册,可以做为你的设计参考。

c++友元

 C++基础--友元我们知道:的公有成员能够在外访问,私有的成员只能被的其它成员函数访问。在C++中,可以定义友元,如果某一个函数定义为友元,则该函数就可以访问该的私有成员,下面举例说明友元函数的使用。假定我们已经定义了两个集合变量,一个为整型数集合,另一个为实型数集合:程序段10-7class IntSet {pu

gaoxiaowei的专栏 1571

c++——友元

如有兴趣了解更多请关注我的个人博客。

xiaohei07的博客 2128

Qt程序编译是出现"field has incomplete type"问题的解决(转)

zh转自“http://blog.csdn.net/jobsss/article/details/7678646” 在编译程序是出现了如下错误,结构体的前向声明只能用来定义指针对象引用,因为编译到这里时还没有发现定义,不知道该者结构的内部成员,没有办法具体的构造一个对象,所以会报错。将成员改成指针就好了。 程序中使用incomplete type实现前置声明有助与实现数据的隐藏。...

weixin_33794672的博客 1560

C++——友元 & 内部

1. 友元函数 友元函数可以直接访问的私有成员,它是定义在外部的普通函数,不属于任何,但需要在的内部声明声明时需要加friend关键字 举例: class Date { friend ostream& operator<<(ostream& _cout, const Date& d); friend istream& operator>>(istream& _cin, Date& d); public: Dat.

m0_46657980的博客 1267

CPP-基础友元

友元可以是一个函数,该函数被称为友元函数;友元也可以是一个,该被称为友元。 我们已知道具有封装和信息隐藏的特性。只有的成员函数才能访问的私有成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,型检查和安全性检查等...

avgp36575的博客 90

C++基础友元

B是A的朋C是B的朋,但C不一定是A的朋。定义:的特点是私有成员无法在作用域外访问,而友元函数是特权函数,允许访问私有成员。2.友元关系是单向的,A是B的朋,但B不一定是A的朋。//需要引用的要在前面声明

m0_61628700的博客 447

c++基础知识:友元

初识c++友元

qq_48335434的博客 235

基础C++友元

C++友元4.4.1 全局函数做友元4.4.2 友元4.4.3 成员函数做友元 在程序里,有些私有属性 也想让外特殊的一些函数进行访问,就需要用到友元的技术 友元的目的就是让一个函数 访问另一个中私有成员 友元的关键字为 friend 友元的三种实现 全局函数做友元 友元 成员函数做友元 4.4.1 全局函数做友元 class Building { //告诉编译器 goodGay全局函数 是 Building的好朋,可以访问中的私有内容 friend void goodG

david2000999的博客 148

C++基础语法:友元

"打牢基础,万事不愁" .C++基础语法的学习."学以致用,边学边用",编程是实践性很强的技术,在运用中理解,总结.以 6th Edition(以下称"本书")的内容开展学习。

jllws1的博客 522

C++基础---友元

友元概念 友元函数 定义: friend(参数列表)#include using namespace std; //定义友元函数 class Rectangle { private: double length; double width; public: Rectangle(double l,double w):length(l),width(w

谦190的博客 527

C++基础-友元详解

C++友元详解

qq_30725967的博客 438

C++基础(十三)友元

背景:在中 私有成员变量无法被外访问 1.全局函数做友元 实例代码如下: #include <iostream> using namespace std; class Person { //友元 friend void showDetial(Person* p); public: Person(): m_Age(10), m_Name(20) { } public: int m_Age; private: int m_Name; }; void showDe.

we1less的博客 213

C++基础友元总结&&一些坑

编译器会在友元的代码中直接访问被访问的私有成员,同样无需经过访问权限检查。编译器在生成代码时会根据友元关系插入适当的权限访问代码,以确保友元函数友元可以访问私有成员。这样,尽管在的定义中进行了访问控制,但通过友元关系,某些函数可以绕过这些访问限制来访问私有成员。总的来说,友元关系的底层实现是。

weixin_42809675的博客 1967

C++基础知识学习记录—友元

实现了数据的隐藏与封装,的数据成员一般定义为私有成员,仅能通过的成员函数才能读写。如果数据成员定义为公共的,则又破坏了封装性。但是某些情况下,需要频繁读写的数据成员,特别是在对某些成员函数多次调用时,由于参数传递、型检查和安全性检查等都需要时间开销,而影响程序的运行效率。友元是一种定义在外部的普通函数,但他。

jhbuy的博客 750

C++基础知识:友元是什么,友元(全局函数做友元

在程序里,有些私有属性 也想让外特殊的一些函数进行访问,就需要用到友元的技术。通俗一点说就是友元,就好比你的闺蜜,你可以让他了解你身上的特有的东西。友元的目的就是让一个函数 访问另一个中私有成员。

我就知道你会来,我们一起进步吧! 394

35 C++基础-友元

1.友元 C++ 中可以使用 friend 关键字将函数、声明为某个友元 友元具有一些特权,可以访问 private 的成员 友元只能授予,不能索取,单向,不能传递 2. 友元函数 在体重使用 friend 关键字进行声明 friend void fun(); // func 是非成员函数,不属于任何 #ifndef TIME_H #define TIME_H cl...

苏法迪的专栏 211

c++_友元基础知识

友元,打破的隐藏和封装,方便访问与修改,提高效率 1,友元函数:直接在函数前加friend,并且没有this->属性(非成员函数) 函数与存放位置无关,直接调用,似于使用空间,直接只用函数名调用。 2,友元前加上friend,没有交换性和传递性,不能互为友元, 数据传递: a>,其中静态变量常用于的数据传递 b>,直接引用,实现数据传递 3,...

zg915355901的博客 383
上一篇: c++纯虚函数与虚函数的区别
下一篇: C ++ delete 和delete[]
Zebulon
博客等级 码龄16年 153粉丝 35原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值