首页
学习
活动
专区
圈层
工具
发布

模板类的友元

它可以访问全局对象;可以使用全局指针访问非全局对象;可以创建自己的对象;可以访问独立对象的模板类 的静态数据成员。 如果要为友元函数提供械板类参数,可以如下所示来进行友元声明。...具体的说,为约束模板友元作准备,要使类的每一个基体 化都获得与友元匹配的基体化。...,这样每种T类型都有自己的友元函数count(); 非约束模板友元 友元的所有具体化都是类的每一个具体化的友元 上边说的约束模板友元函数是在类外面声明的模板的具体化。...通过在类内部声明模板,可以创建非约束友元函数,即每个函数具体化都是每个类具体化的友元。...共同的友元: 一个成员函数,它可以是一个类的成员,同时是另一个类的友元,但有时将函数作为两个类的友元更合理。

1.1K70

【C++】友元类 ( 友元类简介 | 友元类声明 | 友元类单向性 | 友元类继承性 | 友元类作用 | 友元类和友元函数由来 | Java 反射机制 | C C++ 编译过程 )

一、友元类简介 1、友元类引入 在 C++ 语言中 , " 友元类 " 是 一个类 与 另外一个类 的 特殊类关系累 , 在 类 A 的 " 友元类 " B 中 , 可以直接访问 A 类 的 私有成员...和 受保护成员 ; B 是 A 的好朋友 , B 可以访问 A 的所有成员 ; 2、友元类声明 声明一个 类 B 是 另一个类 A 的 友元类 , 可以 在类 A 中使用 friend 关键字来声明 ;...friend class StudentCaculate; } 3、友元类单向性 友元类单向性 : 友元类关系是单向的 , 声明一个类 B 是 另一个类 A 的 友元类 , B 可以访问 A 的 所有成员..., 但是 A 不是 B 的友元类 , A 不能访问 B 的私有和保护成员 ; 4、友元类继承性 友元类 关系不具有继承性 , 即 子类不能直接继承父类的友元类 ; 5、友元类作用 友元类主要作用 :...作为 某个类的 数据操作 辅助类 ; 作为 多个类 之间 传递信息 的 辅助类 ; 二、友元类和友元函数由来 1、友元类和友元函数引入 友元类 和 友元函数 会破坏 C++ 面向对象 的封装性 , 那么为什么还会出现该机制呢

3.4K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    友元类

    友元类所有的方法都可以访问原始类的私有成员和保护成员 声明 friend class ClassName 友元声明可以位于公有、私有或保护部分,其所在的位置无关紧要。..._r.volup(_t,2); _r.ShowTv(_t); cin.get(); }  上边的例子中代码真正访问Tv成员的是Remote方法是volup,其它的方法不是真需要作为友元的...因此它是唯一需要作为友元的方法 确实可以选择仅让特定的类成员成为另一个类的友元,需不必须让整个类成为友元,但这样稍微有点麻烦,必须小心排列各种声明和定义的顺序。...让Remote::volup()成为Tv类的友元的方法,在Tv类声明中将其声明为友元 class {   friend void Remote::set_chan(Tv & t,int c); };  ...然而,要使编译器能够处理这条语句,它必须知道Remote的定义,否则就无法知道Remote是一个类,而set_chan是这个类的方法。

    60870

    C++友元函数和友元类

    在 C++ 中,一个类中可以有 public、protected、private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员。...现在,我们来介绍一种例外情况——友元(friend)。 借助友元(friend),可以使得其他类中的成员函数以及全局范围内的函数访问当前类的 private 成员。...在 C++ 中,这种友好关系可以用 friend 关键字指明,中文多译为“友元”,借助友元可以访问与其有好友关系的类中的私有成员。...如果你对“友元”这个名词不习惯,可以按原文 friend 理解为朋友。 友元函数 在当前类以外定义的、不属于当前类的函数也可以在类中声明,但要在前面加 friend 关键字,这样就构成了友元函数。...友元函数可以是不属于任何类的非成员函数,也可以是其他类的成员函数。 友元函数可以访问当前类中的所有成员,包括 public、protected、private 属性的。

    22150

    C++_友元函数与友元类

    友元 1.知识点介绍 类的特性之一就是封装,而友元就是C++为用户提供打破这种封装的手段,友元分为友元函数和友元对象 2.友元函数 1、友元函数,他只是一个函数,友元函数不是类的成员,通过类对象是无法访问的...2、友元函数,无论声明在类中的任访问属性下都可以,不影响他的调用和访问 !!!...友元函数无论在类外定义, 还是在类内定义都不属于类 用例: #include using namespace std; class CA { int num; // 私有数据成员 void...fun(); // 私有函数成员 friend void FFun(CA& a); // 类外定义友元函数 friend void FFun1(CA& a) // 类中定义友元函数 {...友元类是一个单独的类,只不过和友元函数一样,在类中声明了一个友元类,在这个友元类中同样也 可以访问该类中的所有成员,在A类中声明B类为A类的友元类,那么在B类中就可以访问A类中的所有成员 // 示例

    56620

    C++友元函数与友元类

    友元函数是一个可以访问类的私有成员的函数,并且它不属于这个类。 友元类则是可以访问另一个类的私有成员的类。...声明友元函数/友元类,则需要这样做: 比如,我们需要生命ClassTwo是ClassOne的友元类,那么我们要在ClassOne中加入这么一行语句: friend class ClassTwo; 相应的...这就是说,如果函数B要成为类A的友元函数,那么必须在A中声明B是友元函数。 并且,朋友关系不具有对称性。假设有两个类A、B,B是A的友元类,但是并不意味着A是B的友元类。...(除非在B中声明A是它的友元类) 朋友关系不具有传递性。B是A的友元类,C是B的友元类,那么并不意味着C一定是A的友元类。...int x; }; //setX可以修改Count中的私有成员的值,因为在第六行已经把它定义为类Count的友元函数 void setX(Count& c, int val) { c.x = val

    34520

    C++:11---友元函数、友元类

    一、友元(friend) 概念:通过友元,打破了类的封装性,可以访问类内的所有成员 分类:友元函数、友元类 二、友元函数 概念:友元函数是一个普通函数,不属于类,但需要在类内表明友元关系...友元函数可访问类内所有成员,但类不可以访问友元函数内部数据 格式 友元函数可以在类内声明时,需要加上关键字friend 友元函数可以在类外声明,类外定义。...友元类也不属于类成员,不拥有this指针 一个类A成为另一个类B的友元类时,类A就可以访问类B的所有成员 友元类的形式分为两种 使整个类成为友元 使类中的某一部分函数成为友元 使整个类成为友元 class...四、友元特点 单方向性:即友元可访问类,但是类不能访问友元 不传递性:A是B的友元,C是A的友元,但C不是B的友元 不继承:在上面的友元类中有介绍 ?...五、友元的声明和作用域的关系 使用一个友元时,要考虑到其友元的声明和作用域的问题,请看下面代码 class X { public: friend void f(){} //友元函数在类内定义 X()

    65920

    友元类和嵌套类

    友元类 友元函数用于类的扩展接口中,类并非只能拥有友元函数,也可以将类作为友元,该类称为友元类。...友元类的所有方法都可以访问原始类的私有成员和保护成员,但也可以对其做更严格的限制,使得特定的成员函数成为另一个类的友元。...友元类和继承、包含的关系 我们为什么要提供友元类的这种接口呢,它既然可以从外部访问类的私有部分的权限,是不是与我们面向对象的编程思想相悖呢?...答案显然是否定的,那我们举个例子分析一下,友元类存在的意义。...这表明Remote类应该作为TV类的一个友元类,这样就可以轻松调TV类中的成员和成员函数,来完成自己的接口实现。因此友元类不仅没有与面向对象的编程思想相悖,而且提高了公有接口的灵活性。

    82640

    C++类的this指针,静态成员,友元函数友元类

    友元函数友元类 所谓友元函数,就是在类中,用friend关键字声明一个函数,这个函数的声明在类中,但不作为类的成员函数,虽然友元函数不属于成员函数,却可以访问类中的成员,不论成员是public,pirvate...对于友元函数,放在public和private,或者是protected,都是可以的。...:在实现类之间数据共享时,减少系统开销,提高效率,具体来说:为了使其他类的成员函数直接访问该类的私有变量,同时也破坏了类的封装性,所以不到万不得已,还是不要用友元函数。...因为是需要友元来共享数据,那么大多数情况,友元函数都是有参数的, 因为友元函数没有this指针,则参数要有三种情况: 要访问非static成员时,需要对象做参数; 要访问static成员或全局变量时...,则不需要对象做参数 如果做参数的对象是全局对象,则不需要对象做参数 至于友元类,也是一样。

    1.7K10

    将模板申明为友元

    只有当函数模板(或类模板)被实例化之后生成模板函数(或模板类),该函数(或类)才能作为其他的类的友元。...为了叙述的方便,我们也称一个函数模板(或类模板)是一个类或类模板的友元,其实真正的含义是函数模板(或类模板)被实例化后生成的模板函数(模板类)作为类(或模板类)的友元。 1....把函数模板声明为类模板的友元 将函数模板申明为类模板的友元有三种方式。...---- 2.把类模板声明为类模板的友元 把类模板声明为类模板的友元可以有两种方式。 2.1在类模板内部对模板类进行友元申明 这里要注意是对实例化后的模板类将其申明为类模板的友元,而不是类模板。...2.2在类模板内部对类模板进行友元申明 这里要注意是直接将类模板申明为类模板的友元,而不是实例化后的模板咧,要与上面区别对待。

    83111

    什么是友元类

    我们就把类B叫做类A的友元。...但是我们应该注意的是,我们把类B设置成了类A的友元类,但是这并不会是类A成为类B的友元。说白了就是:甲愿意把甲的秘密告诉乙,但是乙不见得愿意把乙自己的秘密告诉甲。...这也就是说,友元类和原来那个类之间并没有什么继承关系,也不存在包含或者是被包含的关系,友元类和我上一篇博文《谈谈:C++类的“包含”机制》中的包含是完全不一样的!...大家都之道,遥控机类和电视机类是不相包含的,而且,遥控器可以操作电视机,但是电视机无法操作遥控器,这就比较符合友元的特性了。即我们把遥控器类说明成电视机类的友元。...那么程序中就可以来调用TV类中的私有成员。下面,是该程序的输出: 好了,这就是友元类了。关于友元类,我反正是这样认为的,因为友元类有可能会破坏数据的安全性,我们还是少用为好啊!

    58420

    C++友元函数和友元类的使用

    1.友元介绍 在C++中,友元(friend)是一种机制,允许某个类或函数访问其他类的私有成员。通过友元,可以授予其他类或函数对该类的私有成员的访问权限。...友元关系在一些特定的情况下很有用,例如在类之间共享数据或实现特定的功能。 友元可以分为两种类型:类友元和函数友元。...2.类友元 类友元(Friend Class): 可以将一个类声明为另一个类的友元。这样,在被声明为友元的类中,就可以直接访问另一个类的私有成员。...类友元关系在类之间共享数据或实现特定功能时很有用。 友元关系是单向的,不具有传递性。如果类A是类B的友元,类B不一定是类A的友元。...当某个类需要提供特定函数或操作给其他类使用,但这些函数需要访问类的私有成员时,可以使用函数友元。 在重载运算符或实现某些特定功能时,友元可以提供对类私有成员的直接访问。

    45740

    从零开始学C++之友元:友元函数和友元类

    一、友元介绍 我们知道,类的成员函数可以访问同类的其他成员函数,包括公有、私有和保护成员。而类的外部函数只能访问类的公有成员。 友元是一种允许非类成员函数访问类的非公有成员的一种机制。...可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元。...友元函数 友元类 二、友元函数 友元函数在类作用域外定义,但它需要在类体中进行说明 为了与该类的成员函数加以区别,定义的方式是在类中用关键字friend说明该函数,格式如下: friend  ...类型 友元函数名(参数表); 友元的作用在于提高程序的运行效率 友元函数注意事项: 1、友元函数不是类的成员函数,在函数体中访问对象的成员,必须用对象名加运算符“.”加对象成员名。...,即A类向B类开放其Private/Protectd内容, 让B直接存取 友元类:一个类可以作另一个类的友元 友元类的所有成员函数都是另一个类的友元函数 友元类的声明: friend class 类名;

    80100

    C++面向对象友元,全局函数、类、成员函数做友元

    友元 生活中你的家有客厅(Public),有你的卧室(Private) 客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去 但是呢,你也可以允许你的好闺蜜好基友进去。...在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术 友元的目的就是让一个函数或者类 访问另一个类中私有成员 友元的关键字为 ==friend== 友元的三种实现 全局函数做友元...类做友元 成员函数做友元 全局函数做友元 class Building { //告诉编译器 goodGay全局函数 是 Building类的好朋友,可以访问类中的私有内容 friend void...test01() { Building b; goodGay(&b); } int main(){ test01(); system("pause"); return 0; } 类做友元...告诉编译器 goodGay类是Building类的好朋友,可以访问到Building类中私有内容 可以设置类与类之间的访问权限 成员函数做友元 class Building; class goodGay

    45920

    【C++ 语言】面向对象 ( 成员函数 | 常量函数 | 友元函数 | 友元类 | 单例类 )

    文章目录 成员函数 常量函数 友元函数 new 创建对象 友元类 单例类 成员函数 ---- 此处继续上一篇博客继续向后讲解C++面向对象 类成员方法 , 除了定义构造方法与析构方法之外 ,...---- 外部访问类中的私有成员变量 , 有两种方法 , 一种是使用共有的成员方法访问 , 另一种是在友元函数中访问 ; 友元函数 , 在友元函数中 , 可以从类的外部访问类中的私有成员变量 ,...---- 友元类 , 友元类中所有的成员函数都是该类的友元函数 , 可以访问该类对象的私有成员变量 ; 友元类声明 , 声明友元类方法 friend class 友元类名称; , 友元类中所有的成员函数都是该类的友元函数...; Student.h 中友元类声明 //声明友元类 , 可以在友元类中访问修改类中的私有成员变量 //友元类中的所有的成员函数都是友元函数 friend class Teacher; 友元类定义与实现...中的友元类 , 该友元类中的所有函数都是 Student 对象的友元函数 class Teacher { public: //友元类中声明方法 , 修改 Student 中的 id 编号 void

    59820

    【C++】泛型编程 ⑨ ( 类模板的运算符重载 - 函数声明 和 函数实现 写在同一个类中 | 类模板 的 外部友元函数问题 )

    如果要在 类模板 中进行运算符重载 , 就需要用到友元函数 ; 如果将 类模板 的 函数实现 , 定义在函数外部 , 结合 友元函数 使用 , 就变得很复杂 , 下面针对该问题进行讨论 ; 二、普通类的运算符重载..., 左移运算符 重载 是在类外部 通过友元函数实现的 , 因为左移运算符的 左操作数是 ostream& 类型的 , 如果定义在了 类内部 , 左操作数就默认为当前类 ; 代码示例 : #include...三、类模板的运算符重载 - 函数声明 和 函数实现 写在同一个类中 1、类模板 的 外部友元函数问题 将上述 " 普通类的运算符重载 - 函数声明 和 函数实现 写在同一个类中 " 示例改造成 类模板...示例 ; 问题就出现在 定义在外部的 友元函数 中 , 友元函数 , 不能 读取 和 访问 到 泛型类型 T , 也就是 类模板 中 的 template 泛型类型 T ; 在外部重新定义...template 就是重新定义了一个新的泛型 , 与 类模板 中的 T 不是同一个泛型类型 ; 解决上述问题 , 就需要将 友元函数 定义在 类模板 的内部 ; template

    66810
    领券